La autenticación de proxy básica para URL HTTPS devuelve HTTP / 1.0 Se requiere autenticación de proxy 407

Quiero usar un proxy con autenticación básica (nombre de usuario, contraseña) para una conexión (y solo esta conexión) en Java. El siguiente código funciona para las URL HTTP (por ejemplo, "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();

El código no funciona para las URL HTTPS (por ejemplo, "https://www.google.com"), aunque! me salejava.io.IOException: Unable to tunnel through proxy. Proxy returns "HTTP/1.0 407 Proxy Authentication Required" cuando intento acceder a una URL HTTPS.

Este código funciona para HTTP y 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();

El problema con el segundo código es que establece un nuevo valor predeterminadoAuthenticator y no quiero hacer eso, porque este proxy solo lo usa una parte de la aplicación y una parte diferente de la aplicación podría estar usando un proxy diferente. No quiero establecer un valor predeterminado global para toda la aplicación. ¿Hay alguna manera de hacer que el primer código funcione con HTTPS o una forma de usar unAuthenticator sin configurarlo como predeterminado?

Tengo que usarjava.net.HttpURLConnection, porque estoy anulando un método de una clase que tiene que devolver unHttpURLConnection, así que no puedo usar Apache HttpClient.

Respuestas a la pregunta(4)

Su respuesta a la pregunta