It looks like your tunnel proxy might not allow "CONNECT" statements. You should test first manually, using a telnet client. If it works in telnet, it should work in httpclient. hth.
On Thu, Jun 5, 2014 at 9:01 PM, galengt <[email protected]> wrote: > Hi Ryan and Oleg, > > Thanks for this thread, has been very helpful. Like Ryan I have 4.2 locally > and have overwritten createTunnelToProxy, but I think I am missing > something. > > Execution looks like this: > DefaultHttpClient client = new DefaultHttpClient(); > HttpRoutePlanner routePlanner = new TwoHopRoutePlanner(host, port, host2, > port2); > client.setRoutePlanner(routePlanner); > client.execute(get) > > TwoHopRoutePlanner is super simple, implements HttpRoutePlanner and has the > override below: > @Override public HttpRoute determineRoute(HttpHost target, > HttpRequest request, HttpContext context) throws HttpException { > HttpHost proxy1 = new HttpHost(this.host1, this.port1); > HttpHost proxy2 = new HttpHost(this.host2, this.port2); > HttpHost[] proxies = new HttpHost[] {proxy1, proxy2}; > return new HttpRoute(target, null, proxies, false, > TunnelType.TUNNELLED, LayerType.PLAIN); > } > } > > > Here is my attempt at createTunnelToProxy: > > protected boolean createTunnelToProxy(HttpRoute route, int hop, > HttpContext context) throws HttpException, IOException { > //final HttpHost proxy = route.getProxyHost(); > final HttpHost target = route.getTargetHost(); > HttpResponse response = null; > for (int i = 0; i < route.getHopCount(); i++) { > final HttpHost proxy = route.getHopTarget(i); > if (!this.managedConn.isOpen()) { > this.managedConn.open(route, context, this.params); > } > > final HttpRequest connect = createConnectRequest(route, > context); > connect.setParams(this.params); > > // Populate the execution context > context.setAttribute(ExecutionContext.HTTP_TARGET_HOST, > target); > context.setAttribute(ExecutionContext.HTTP_PROXY_HOST, proxy); > context.setAttribute(ExecutionContext.HTTP_CONNECTION, > managedConn); > context.setAttribute(ExecutionContext.HTTP_REQUEST, connect); > > this.requestExec.preProcess(connect, this.httpProcessor, > context); > > System.out.println("CONNECT Issued: " + "host:" + > proxy.getHostName() + " port: " + proxy.getPort() + " scheme: " + > proxy.getSchemeName()); > response = this.requestExec.execute(connect, this.managedConn, > context); > > response.setParams(this.params); > this.requestExec.postProcess(response, this.httpProcessor, > context); > > final int status = response.getStatusLine().getStatusCode(); > System.out.println("CONNECT status code: " + status); > if (status < 200) { > throw new HttpException("Unexpected response to CONNECT > request: " + response.getStatusLine()); > } > } > final int status = response.getStatusLine().getStatusCode(); > if (status > 299) { > > // Buffer response content > final HttpEntity entity = response.getEntity(); > if (entity != null) { > response.setEntity(new BufferedHttpEntity(entity)); > } > > this.managedConn.close(); > throw new TunnelRefusedException("CONNECT refused by proxy: " + > response.getStatusLine(), response); > } > > this.managedConn.markReusable(); > return false; > } > > > I added a couple printlns in there, here is an example output: > CONNECT Issued: host:119.2.41.98 port: 8080 scheme: http > CONNECT status code: 200 > CONNECT Issued: host:119.2.41.98 port: 8080 scheme: http > CONNECT status code: 405 > CONNECT Issued: host:www.xhaus.com port: -1 scheme: http > CONNECT status code: 405 > > The body comes back with an error that includes: "The requested method > CONNECT is not allowed for the URL /index.html". I am guessing I missed > something in createTunnelToProxy, any help would be appreciated! > > > > -- > View this message in context: > http://httpcomponents.10934.n7.nabble.com/Proxy-chaining-tp19965p23546.html > Sent from the HttpClient-User mailing list archive at Nabble.com. > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected] > >
