Uploaded image for project: 'HttpComponents HttpClient'
  1. HttpComponents HttpClient
  2. HTTPCLIENT-2248

Async HTTP/2 with SOCKS and HTTPS fails

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Major
    • Resolution: Fixed
    • 5.2
    • 5.2.1
    • HttpClient (async)
    • None

    Description

      Running the following:

      try (CloseableHttpAsyncClient httpclient =
              HttpAsyncClients.customHttp2()
                      .setIOReactorConfig(
                              IOReactorConfig.custom()
                                      .setSocksProxyAddress(new InetSocketAddress("127.0.0.1", 9150))
                                      .build())
                      .build()) {
          httpclient.start();
      
          final HttpHost target = new HttpHost("https", "nghttp2.org");
          final SimpleHttpRequest request =
                  SimpleRequestBuilder.get().setHttpHost(target).setPath("/httpbin/ip").build();
      
          System.out.println("Executing request " + request);
          final Future<SimpleHttpResponse> future =
                  httpclient.execute(
                          SimpleRequestProducer.create(request),
                          SimpleResponseConsumer.create(),
                          new FutureCallback<SimpleHttpResponse>() {
      
                              @Override
                              public void completed(final SimpleHttpResponse response) {
                                  System.out.println(request + "->" + new StatusLine(response));
                                  System.out.println(response.getBody());
                              }
      
                              @Override
                              public void failed(final Exception ex) {
                                  System.out.println(request + "->" + ex);
                              }
      
                              @Override
                              public void cancelled() {
                                  System.out.println(request + " cancelled");
                              }
                          });
          future.get();
      }
      

      Results in:

      Executing request GET https://nghttp2.org/httpbin/ip
      GET https://nghttp2.org/httpbin/ip->javax.net.ssl.SSLHandshakeException: TLS handshake failed
      Exception in thread "main" java.util.concurrent.ExecutionException: javax.net.ssl.SSLHandshakeException: TLS handshake failed
      	at org.apache.hc.core5.concurrent.BasicFuture.getResult(BasicFuture.java:72)
      	at org.apache.hc.core5.concurrent.BasicFuture.get(BasicFuture.java:85)
      	at org.apache.hc.client5.http.examples.AsyncH2Socks.main(AsyncH2Socks.java:77)
      Caused by: javax.net.ssl.SSLHandshakeException: TLS handshake failed
      	at org.apache.hc.core5.reactor.ssl.SSLIOSession.updateEventMask(SSLIOSession.java:454)
      	at org.apache.hc.core5.reactor.ssl.SSLIOSession.setEventMask(SSLIOSession.java:791)
      	at org.apache.hc.core5.reactor.SocksProxyProtocolHandler.inputReady(SocksProxyProtocolHandler.java:242)
      	at org.apache.hc.core5.reactor.ssl.SSLIOSession.decryptData(SSLIOSession.java:624)
      	at org.apache.hc.core5.reactor.ssl.SSLIOSession.access$200(SSLIOSession.java:74)
      	at org.apache.hc.core5.reactor.ssl.SSLIOSession$1.inputReady(SSLIOSession.java:202)
      	at org.apache.hc.core5.reactor.InternalDataChannel.onIOEvent(InternalDataChannel.java:142)
      	at org.apache.hc.core5.reactor.InternalChannel.handleIOEvent(InternalChannel.java:51)
      	at org.apache.hc.core5.reactor.SingleCoreIOReactor.processEvents(SingleCoreIOReactor.java:178)
      	at org.apache.hc.core5.reactor.SingleCoreIOReactor.doExecute(SingleCoreIOReactor.java:127)
      	at org.apache.hc.core5.reactor.AbstractSingleCoreIOReactor.execute(AbstractSingleCoreIOReactor.java:86)
      	at org.apache.hc.core5.reactor.IOReactorWorker.run(IOReactorWorker.java:44)
      	at java.base/java.lang.Thread.run(Thread.java:829)
      

      If the scheme is changed to HTTP it succeeds:

      Executing request GET http://nghttp2.org/httpbin/ip
      GET http://nghttp2.org/httpbin/ip->HTTP/2.0 200 OK
      SimpleBody{content length=32, content type=application/json}
      

      Attachments

        Activity

          People

            Unassigned Unassigned
            thc202 Ricardo Pereira
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: