import com.squareup.okhttp.Request; //导入方法依赖的package包/类
private void createTunnel(int readTimeout, int writeTimeout) throws IOException {
Request tunnelRequest = createTunnelRequest();
HttpUrl url = tunnelRequest.httpUrl();
String requestLine = "CONNECT " + url.host() + ":" + url.port() + " HTTP/1.1";
do {
Http1xStream tunnelConnection = new Http1xStream(null, this.source, this.sink);
this.source.timeout().timeout((long) readTimeout, TimeUnit.MILLISECONDS);
this.sink.timeout().timeout((long) writeTimeout, TimeUnit.MILLISECONDS);
tunnelConnection.writeRequest(tunnelRequest.headers(), requestLine);
tunnelConnection.finishRequest();
Response response = tunnelConnection.readResponse().request(tunnelRequest).build();
long contentLength = OkHeaders.contentLength(response);
if (contentLength == -1) {
contentLength = 0;
}
Source body = tunnelConnection.newFixedLengthSource(contentLength);
Util.skipAll(body, ActivityChooserViewAdapter.MAX_ACTIVITY_COUNT_UNLIMITED, TimeUnit
.MILLISECONDS);
body.close();
switch (response.code()) {
case 200:
if (!this.source.buffer().exhausted() || !this.sink.buffer().exhausted()) {
throw new IOException("TLS tunnel buffered too many bytes!");
}
return;
case 407:
tunnelRequest = OkHeaders.processAuthHeader(this.route.getAddress()
.getAuthenticator(), response, this.route.getProxy());
break;
default:
throw new IOException("Unexpected response code for CONNECT: " + response
.code());
}
} while (tunnelRequest != null);
throw new IOException("Failed to authenticate with proxy");
}