A autenticação de proxy básica para URLs HTTPS retorna HTTP / 1.0 407 Autenticação de proxy necessária

Eu quero usar um proxy com autenticação básica (nome de usuário, senha) para uma conexão (e somente essa conexão) em Java. O código a seguir funciona para URLs HTTP (por exemplo, "http://www.google.com"):

URL url = new URL("http://www.google.com");
HttpURLConnection httpURLConnection = null;
InetSocketAddress proxyLocation = new InetSocketAddress(proxyHost, proxyPort);
Proxy proxy = new Proxy(Proxy.Type.HTTP, proxyLocation);
httpURLConnection = (HttpURLConnection) url.openConnection(proxy);
// Works for HTTP only! Doesn't work for HTTPS!
String encoded = new sun.misc.BASE64Encoder().encodeBuffer((proxyUserName + ":" + proxyPassword).getBytes()).replace("\r\n", "");
httpURLConnection.setRequestProperty("Proxy-Authorization", "Basic " + encoded);
InputStream is = httpURLConnection.getInputStream();
InputStreamReader isr = new InputStreamReader(is); 
int data = isr.read();
while(data != -1){
  char c = (char) data;
  data = isr.read();
  System.out.print(c);
}
isr.close();

O código não funciona para URLs HTTPS (por exemplo, "https://www.google.com"), embora! eu recebojava.io.IOException: Unable to tunnel through proxy. Proxy returns "HTTP/1.0 407 Proxy Authentication Required" quando tento acessar um URL HTTPS.

Este código funciona para HTTP e HTTPS:

URL url = new URL("https://www.google.com");
HttpURLConnection httpURLConnection = null;
InetSocketAddress proxyLocation = new InetSocketAddress(proxyHost, proxyPort);
Proxy proxy = new Proxy(Proxy.Type.HTTP, proxyLocation);
httpURLConnection = (HttpURLConnection) url.openConnection(proxy);
// Works for HTTP and HTTPS, but sets a global default!
Authenticator.setDefault(new Authenticator() {
  protected PasswordAuthentication getPasswordAuthentication() {
    return new PasswordAuthentication(proxyUserName, proxyPassword.toCharArray());
  }
});
InputStream is = httpURLConnection.getInputStream();
InputStreamReader isr = new InputStreamReader(is); 
int data = isr.read();
while(data != -1){
  char c = (char) data;
  data = isr.read();
  System.out.print(c);
}
isr.close();

O problema com o segundo código é que ele define um novo padrãoAuthenticator e não quero fazer isso, porque esse proxy é usado apenas por uma parte do aplicativo e uma parte diferente do aplicativo pode estar usando um proxy diferente. Não quero definir um padrão global para todo o aplicativo. Existe uma maneira de obter o primeiro código para trabalhar com HTTPS ou uma maneira de usar umAuthenticator sem defini-lo como padrão?

Eu tenho que usarjava.net.HttpURLConnection, porque estou substituindo um método de uma classe que precisa retornar umHttpURLConnection, então não posso usar o Apache HttpClient.

questionAnswers(4)

yourAnswerToTheQuestion