Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

HttpClient: how do I obtain the underlying socket from an existing connection?

I am using HttpClient 4.02 to create a connection via proxy (using the CONNECT method) to tunnel a connection to a remote server. HttpClient is very convenient for this but I am new to the API and cannot see how to get at the underlying Socket of the tunneled connection.

The following code taken from: http://svn.apache.org/repos/asf/httpcomponents/httpclient/tags/4.0.1/httpclient/src/examples/org/apache/http/examples/client/ClientExecuteProxy.java

    // make sure to use a proxy that supports CONNECT
    HttpHost target = new HttpHost("target.server.net", 443, "https");
    HttpHost proxy = new HttpHost("some.proxy.net", 8080, "http");

    // general setup
    SchemeRegistry supportedSchemes = new SchemeRegistry();

    // Register the "http" and "https" protocol schemes, they are
    // required by the default operator to look up socket factories.
    supportedSchemes.register(new Scheme("http", 
            PlainSocketFactory.getSocketFactory(), 80));
    supportedSchemes.register(new Scheme("https", 
            SSLSocketFactory.getSocketFactory(), 443));

    // prepare parameters
    HttpParams params = new BasicHttpParams();
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);

    ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, 
            supportedSchemes);

    DefaultHttpClient httpclient = new DefaultHttpClient(ccm, params);

    httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);

    HttpGet req = new HttpGet("/");

    System.out.println("executing request to " + target + " via " + proxy);
    HttpResponse rsp = httpclient.execute(target, req);
    HttpEntity entity = rsp.getEntity();

This sets up the connection nicely but is there a way to get at the underlying Socket in order for me to use a custom protocol to talk to the server at target.server.net?

like image 823
willjcroz Avatar asked Oct 28 '25 09:10

willjcroz


2 Answers

Open a change request in the project's JIRA. This feature simply got overlooked. While it should be fairly trivial to put together an equivalent of ProxyClient from 3.x, it makes sense to ship one with the stock version of HttpClient.

Edit:

Available since version 4.2. See http://hc.apache.org/httpcomponents-client-4.3.x/httpclient/apidocs/org/apache/http/impl/client/ProxyClient.html

like image 102
ok2c Avatar answered Oct 31 '25 00:10

ok2c


Not sure I completely understand your requirements, but I'll give it my best shot...

Try this: http://svn.apache.org/viewvc/httpcomponents/oac.hc3x/trunk/src/examples/ProxyTunnelDemo.java?view=markup

like image 40
Eran Harel Avatar answered Oct 31 '25 01:10

Eran Harel