private void makeTunnel(TunnelRequest tunnelRequest) throws IOException {
  RawHeaders requestHeaders=tunnelRequest.getRequestHeaders();
  while (true) {
    out.write(requestHeaders.toBytes());
    RawHeaders responseHeaders=RawHeaders.fromBytes(in);
switch (responseHeaders.getResponseCode()) {
case HTTP_OK:
      return;
case HTTP_PROXY_AUTH:
    requestHeaders=new RawHeaders(requestHeaders);
  URL url=new URL("https",tunnelRequest.host,tunnelRequest.port,"/");
boolean credentialsFound=HttpAuthenticator.processAuthHeader(route.address.authenticator,HTTP_PROXY_AUTH,responseHeaders,requestHeaders,route.proxy,url);
if (credentialsFound) {
continue;
}
 else {
throw new IOException("Failed to authenticate with proxy");
}
default :
throw new IOException("Unexpected response code for CONNECT: " + responseHeaders.getResponseCode());
}
}
}

private void makeTunnel ( TunnelRequest tunnelRequest ) throws IOException { RawHeaders requestHeaders = tunnelRequest . getRequestHeaders ( ) ; while ( true ) { out . write ( requestHeaders . toBytes ( ) ) ; RawHeaders responseHeaders = RawHeaders . fromBytes ( in ) ; switch ( responseHeaders . getResponseCode ( ) ) { case HTTP_OK : return ; case HTTP_PROXY_AUTH : requestHeaders = new RawHeaders ( requestHeaders ) ; URL url = new URL ( "https" , tunnelRequest . host , tunnelRequest . port , "/" ) ; boolean credentialsFound = HttpAuthenticator . processAuthHeader ( route . address . authenticator , HTTP_PROXY_AUTH , responseHeaders , requestHeaders , route . proxy , url ) ; if ( credentialsFound ) { continue ; } else { throw new IOException ( "Failed to authenticate with proxy" ) ; } default : throw new IOException ( "Unexpected response code for CONNECT: " + responseHeaders . getResponseCode ( ) ) ; } } }
to make an https connection over an http proxy , send an unencrypted connect request to create the proxy connection . this may need to be retried if the proxy requires authorization .
