You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@hc.apache.org by "Robert Elliot (Jira)" <ji...@apache.org> on 2020/06/04 17:47:00 UTC

[jira] [Commented] (HTTPASYNC-139) CloseableHttpAsyncClient not working when a http/https proxy is provided

    [ https://issues.apache.org/jira/browse/HTTPASYNC-139?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17126107#comment-17126107 ] 

Robert Elliot commented on HTTPASYNC-139:
-----------------------------------------

I'm very confused by this statement. Standard HttpClient 4.5.12 seems to do a CONNECT handshake over TLS just fine - I've been using it to test WireMock's proxying abilities.

 

We're using it to test proxying:

HTTP/1.1 via an HTTP/1.1 forward proxy

HTTP/1.1 via an HTTPS forward proxy

HTTPS via an HTTP/1.1 forward proxy

HTTPS via an HTTPS forward proxy

They all work fine. I just wrote some extra tests against squid (for HTTP) and spdyproxy (for HTTPS) docker containers, and no problem with this client:
{code:java}
static HttpResponse getHttpResponse(
  String url, 
  String proxyScheme, 
  int proxyPort
) throws Exception {
  HttpClientBuilder httpClientBuilder = HttpClientBuilder.create()
    .setSSLContext(SSLContexts.custom().loadTrustMaterial(null, (chain, authType) -> true).build())
    .setSSLHostnameVerifier(new NoopHostnameVerifier());

  HttpHost proxyHost = new HttpHost("localhost", proxyPort, proxyScheme);

  HttpClient httpClientUsingProxy = httpClientBuilder
    .setProxy(proxyHost)
    .build();

  URI targetUri = URI.create(url);
  HttpHost target = new HttpHost(targetUri.getHost(), targetUri.getPort(), targetUri.getScheme());
  HttpGet req = new HttpGet(targetUri.getPath() + (isNullOrEmpty(targetUri.getQuery()) ? "" : "?" + targetUri.getQuery()));

  return httpClientUsingProxy.execute(target, req);
}
{code}

> CloseableHttpAsyncClient not working when a http/https proxy is provided
> ------------------------------------------------------------------------
>
>                 Key: HTTPASYNC-139
>                 URL: https://issues.apache.org/jira/browse/HTTPASYNC-139
>             Project: HttpComponents HttpAsyncClient
>          Issue Type: Bug
>    Affects Versions: 4.1.3
>            Reporter: Neha Sharma
>            Priority: Major
>         Attachments: AsyncClientCustomSSL.java
>
>
> We are trying to integrate a vertx based https proxy (to a https target) with CloseableHttpAsyncClient.  Tried below with same error
> # Setting the routeplanner on the  CloseableHttpAsyncClient
> #  Setting the proxy on the  CloseableHttpAsyncClient
> #  Setting the proxy on the http post
> {code:java}
> 18:38:29.443 [I/O dispatcher 1] DEBUG org.apache.http.impl.nio.client.InternalIODispatch - http-outgoing-0 [ACTIVE] Request ready
> java.util.concurrent.ExecutionException: java.lang.IllegalStateException: I/O session is already upgraded to TLS/SSL
> 	at org.apache.http.concurrent.BasicFuture.getResult(BasicFuture.java:70)
> 	at org.apache.http.concurrent.BasicFuture.get(BasicFuture.java:80)
> 	at org.apache.http.impl.nio.client.FutureWrapper.get(FutureWrapper.java:70)
> 	at com.datacard.dcpi.AsyncClientCustomSSL.main(AsyncClientCustomSSL.java:140)
> Caused by: java.lang.IllegalStateException: I/O session is already upgraded to TLS/SSL
> 	at org.apache.http.util.Asserts.check(Asserts.java:34)
> 	at org.apache.http.nio.conn.ssl.SSLIOSessionStrategy.upgrade(SSLIOSessionStrategy.java:164)
> 	at org.apache.http.nio.conn.ssl.SSLIOSessionStrategy.upgrade(SSLIOSessionStrategy.java:64)
> 	at org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager.upgrade(PoolingNHttpClientConnectionManager.java:433)
> 	at org.apache.http.impl.nio.client.AbstractClientExchangeHandler.onRouteUpgrade(AbstractClientExchangeHandler.java:208)
> 	at org.apache.http.impl.nio.client.MainClientExec.generateRequest(MainClientExec.java:181)
> 	at org.apache.http.impl.nio.client.DefaultClientExchangeHandlerImpl.generateRequest(DefaultClientExchangeHandlerImpl.java:134)
> 	at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.requestReady(HttpAsyncRequestExecutor.java:185)
> 	at org.apache.http.impl.nio.client.InternalRequestExecutor.requestReady(InternalRequestExecutor.java:73)
> 	at org.apache.http.impl.nio.DefaultNHttpClientConnection.produceOutput(DefaultNHttpClientConnection.java:287)
> 	at org.apache.http.impl.nio.client.InternalIODispatch.onOutputReady(InternalIODispatch.java:86)
> 	at org.apache.http.impl.nio.client.InternalIODispatch.onOutputReady(InternalIODispatch.java:39)
> 	at org.apache.http.impl.nio.reactor.AbstractIODispatch.outputReady(AbstractIODispatch.java:152)
> 	at org.apache.http.impl.nio.reactor.BaseIOReactor.writable(BaseIOReactor.java:188)
> 	at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:341)
> 	at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315)
> 	at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:276)
> 	at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104)
> 	at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:588)
> 	at java.lang.Thread.run(Thread.java:745)
> 18:38:29.448 [I/O dispatcher 1] DEBUG org.apache.http.impl.nio.client.InternalIODispatch - http-outgoing-0 [ACTIVE] Exception
> java.lang.IllegalStateException: I/O session is already upgraded to TLS/SSL
> 	at org.apache.http.util.Asserts.check(Asserts.java:34)
> 	at org.apache.http.nio.conn.ssl.SSLIOSessionStrategy.upgrade(SSLIOSessionStrategy.java:164)
> 	at org.apache.http.nio.conn.ssl.SSLIOSessionStrategy.upgrade(SSLIOSessionStrategy.java:64)
> 	at org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager.upgrade(PoolingNHttpClientConnectionManager.java:433)
> 	at org.apache.http.impl.nio.client.AbstractClientExchangeHandler.onRouteUpgrade(AbstractClientExchangeHandler.java:208)
> 	at org.apache.http.impl.nio.client.MainClientExec.generateRequest(MainClientExec.java:181)
> 	at org.apache.http.impl.nio.client.DefaultClientExchangeHandlerImpl.generateRequest(DefaultClientExchangeHandlerImpl.java:134)
> 	at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.requestReady(HttpAsyncRequestExecutor.java:185)
> 	at org.apache.http.impl.nio.client.InternalRequestExecutor.requestReady(InternalRequestExecutor.java:73)
> 	at org.apache.http.impl.nio.DefaultNHttpClientConnection.produceOutput(DefaultNHttpClientConnection.java:287)
> 	at org.apache.http.impl.nio.client.InternalIODispatch.onOutputReady(InternalIODispatch.java:86)
> 	at org.apache.http.impl.nio.client.InternalIODispatch.onOutputReady(InternalIODispatch.java:39)
> 	at org.apache.http.impl.nio.reactor.AbstractIODispatch.outputReady(AbstractIODispatch.java:152)
> 	at org.apache.http.impl.nio.reactor.BaseIOReactor.writable(BaseIOReactor.java:188)
> 	at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:341)
> 	at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315)
> 	at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:276)
> 	at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104)
> 	at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:588)
> 	at java.lang.Thread.run(Thread.java:745)
> {code}
> Overriding the upgrade method, exception below
> {code:java}
> 18:44:02.731 [I/O dispatcher 1] DEBUG org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager - Connection released: [id: http-outgoing-0][route: {tls}->https://127.0.0.1:9612->https://google.com:443][total kept alive: 0; route allocated: 0 of 50; total allocated: 0 of 100]
> 18:44:02.731 [I/O dispatcher 1] DEBUG org.apache.http.impl.nio.client.InternalIODispatch - http-outgoing-0 [CLOSED]: Disconnected
> java.util.concurrent.ExecutionException: org.apache.http.ConnectionClosedException: Connection closed
> 	at org.apache.http.concurrent.BasicFuture.getResult(BasicFuture.java:70)
> 	at org.apache.http.concurrent.BasicFuture.get(BasicFuture.java:80)
> 	at org.apache.http.impl.nio.client.FutureWrapper.get(FutureWrapper.java:70)
> 	at com.datacard.dcpi.AsyncClientCustomSSL.main(AsyncClientCustomSSL.java:143)
> Caused by: org.apache.http.ConnectionClosedException: Connection closed
> 	at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.endOfInput(HttpAsyncRequestExecutor.java:345)
> 	at org.apache.http.impl.nio.client.InternalRequestExecutor.endOfInput(InternalRequestExecutor.java:132)
> 	at org.apache.http.impl.nio.DefaultNHttpClientConnection.consumeInput(DefaultNHttpClientConnection.java:261)
> 	at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:81)
> 	at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:39)
> 	at org.apache.http.impl.nio.reactor.AbstractIODispatch.inputReady(AbstractIODispatch.java:121)
> 	at org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:162)
> 	at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:337)
> 	at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315)
> 	at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:276)
> 	at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104)
> 	at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:588)
> 	at java.lang.Thread.run(Thread.java:745)
> 18:44:02.732 [main] DEBUG org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager - Connection manager is shutting down
> 18:44:02.735 [main] DEBUG org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager - Connection manager shut down
> {code}
> Sample code is attached (masked the ip and the urls)



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@hc.apache.org
For additional commands, e-mail: dev-help@hc.apache.org