HttpClient: как получить базовый сокет из существующего соединения? - PullRequest
3 голосов
/ 18 сентября 2010

Я использую HttpClient 4.02 для создания соединения через прокси (используя метод CONNECT) для туннелирования соединения с удаленным сервером.HttpClient очень удобен для этого, но я новичок в API и не могу понять, как добраться до базового Socket туннельного соединения.

Следующий код взят из: 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();

Это правильно устанавливает соединение, но есть способ добраться до базового Socket, чтобы я мог использовать собственный протокол для связи с сервером на target.server.net?

Ответы [ 3 ]

2 голосов
/ 19 сентября 2010

Открыть запрос на изменение в JIRA проекта. Эта функция просто упущена. Хотя собирать эквивалент ProxyClient из версии 3.x будет довольно тривиально, имеет смысл поставлять его со стандартной версией HttpClient.

Edit:

Доступно с версии 4.2. Смотри http://hc.apache.org/httpcomponents-client-4.3.x/httpclient/apidocs/org/apache/http/impl/client/ProxyClient.html

2 голосов
/ 18 сентября 2010

Не уверен, что полностью понимаю ваши требования, но я сделаю все возможное ...

Попробуйте: http://svn.apache.org/viewvc/httpcomponents/oac.hc3x/trunk/src/examples/ProxyTunnelDemo.java?view=markup

0 голосов
/ 18 сентября 2010

В комментарии @willjcroz говорит:

Это так, что мое приложение пригодно для людей за брандмауэрами, где единственным выходом будет веб-прокси. При подключении к прокси-серверу он будет пересылать данные на целевой сервер в виде HTTPS, обеспечивая безопасное соединение с целевым сервером.

Если вы собираетесь успешно туннелировать свой протокол через веб-прокси, межсетевые экраны с поддержкой протокола и т. Д., Клиентская и серверная стороны вашего приложения должны соответствовать спецификациям протокола HTTP. Если вам (каким-то образом) удалось детализировать данные до уровня сокета, есть вероятность, что вы нарушите протокол ...

Вместо этого вы должны реализовать свой собственный протокол, поместив свои данные в содержимое HTTP-запросов и ответов, используя пользовательские HTTP-заголовки в сообщениях / ответах, пользовательские типы содержимого и т. Д.

...