Как использовать собственный сокетфактор в Apache HttpComponents - PullRequest
4 голосов
/ 22 ноября 2011

Я пытался использовать собственный SocketFactory в библиотеке httpclient из проекта Apache HTTPComponents.Пока без удачи.Я ожидал, что смогу просто установить фабрику сокетов для экземпляра HttpClient, но это, очевидно, не так просто.

Документация для HttpComponents на http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html упоминает фабрики сокетов, но не говориткак их использовать.

Кто-нибудь знает, как это делается?

Ответы [ 2 ]

2 голосов
/ 22 ноября 2011

Ответ Олега, конечно, правильный, я просто хотел разместить информацию прямо здесь, на случай, если ссылка испортится. В коде, который создает HttpClient, я использую этот код, чтобы позволить ему использовать мою фабрику сокетов:

    CustomSocketFactory socketFactory = new CustomSocketFactory();
    Scheme scheme = new Scheme("http", 80, socketFactory);
    httpclient.getConnectionManager().getSchemeRegistry().register(scheme);

CustomSocketFactory - моя собственная фабрика сокетов, и я хочу использовать ее для обычного HTTP-трафика, поэтому я использую "http" и 80 в качестве параметров.

Мой CustomSchemeSocketFactory выглядит примерно так:

public class CustomSchemeSocketFactory implements SchemeSocketFactory {

  @Override
  public Socket connectSocket( Socket socket, InetSocketAddress remoteAddress, InetSocketAddress localAddress, HttpParams params ) throws IOException, UnknownHostException, ConnectTimeoutException {

    if (localAddress != null) {
      socket.setReuseAddress(HttpConnectionParams.getSoReuseaddr(params));
      socket.bind(localAddress);
    }
    int connTimeout = HttpConnectionParams.getConnectionTimeout(params);
    int soTimeout = HttpConnectionParams.getSoTimeout(params);

    try {
        socket.setSoTimeout(soTimeout);
        socket.connect(remoteAddress, connTimeout );
    } catch (SocketTimeoutException ex) {
        throw new ConnectTimeoutException("Connect to " + remoteAddress + " timed out");
    }

    return socket;
  }

  @Override
  public Socket createSocket( HttpParams params ) throws IOException {
    // create my own socket and return it
  }

  @Override
  public boolean isSecure( Socket socket ) throws IllegalArgumentException {
    return false;
  }

}
2 голосов
/ 22 ноября 2011

Мы используем собственную фабрику сокетов, чтобы соединения HttpClient могли подключаться к URL-адресам HTTPS с ненадежными сертификатами.

Вот как мы это сделали:

  1. Мы адаптировали реализацииклассов EasySSLProtocolSocketFactory и EasyX509TrustManager из исходного каталога примеров, на который ссылается Олег.

  2. В нашем коде запуска HttpClient мы делаем следующее, чтобы включить новую фабрику сокетов:

    HttpClient httpClient = new HttpClient();
    Protocol easyhttps = new Protocol("https", new EasySSLProtocolSocketFactory(), 443);
    Protocol.registerProtocol("https", easyhttps);
    

Чтобы каждый раз, когда мы запрашиваем URL-адрес https: //, использовалась фабрика сокетов.

...