[ 
https://issues.apache.org/jira/browse/HTTPCORE-710?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Oleg Kalnichevski resolved HTTPCORE-710.
----------------------------------------
    Fix Version/s: 5.2-beta2
       Resolution: Fixed

> Async client hangs if remote peer closes connection during TLS handshake
> ------------------------------------------------------------------------
>
>                 Key: HTTPCORE-710
>                 URL: https://issues.apache.org/jira/browse/HTTPCORE-710
>             Project: HttpComponents HttpCore
>          Issue Type: Bug
>          Components: HttpCore
>    Affects Versions: 5.2-beta1
>            Reporter: Ryan Schmitt
>            Priority: Blocker
>             Fix For: 5.2-beta2
>
>
> I discovered a regression in the 5.2 async client while testing various 
> failure modes for TLS negotiation. In this case, the failure condition is 
> when the client sends a Client Hello and the server responds by immediately 
> closing the connection (with a FIN in this case, not a RST). With client 
> version 5.1.3, when this happened the client would simply throw an exception 
> with the following cause:
> {code}
>         Caused by:
>         org.apache.hc.core5.http2.impl.nio.ProtocolNegotiationException: 
> Unexpected input
>             at 
> app//org.apache.hc.core5.http2.impl.nio.ClientHttpProtocolNegotiator.inputReady(ClientHttpProtocolNegotiator.java:165)
>             at 
> app//org.apache.hc.core5.reactor.ssl.SSLIOSession.decryptData(SSLIOSession.java:574)
>             at 
> app//org.apache.hc.core5.reactor.ssl.SSLIOSession.access$400(SSLIOSession.java:72)
>             at 
> app//org.apache.hc.core5.reactor.ssl.SSLIOSession$1.inputReady(SSLIOSession.java:172)
>             at 
> app//org.apache.hc.core5.reactor.InternalDataChannel.onIOEvent(InternalDataChannel.java:131)
>             at 
> app//org.apache.hc.core5.reactor.InternalChannel.handleIOEvent(InternalChannel.java:51)
>             ... 5 more
> {code}
> Now, on the latest 5.2 nightly, no exception gets thrown at all; whereas 
> {{SSLIOSession}} used to call into 
> {{ClientHttpProtocolNegotiator#inputReady}}, it now ends up in 
> {{AbstractHttp1IOEventHandler#inputReady}} and then 
> {{AbstractHttp1StreamDuplexer#onInput}}, which placidly requests a graceful 
> shutdown by following this code path:
> {code:java}
>         if (endOfStream && !inbuf.hasData()) {
>             if (outputIdle() && inputIdle()) {
>                 requestShutdown(CloseMode.GRACEFUL);
> {code}
> However, even if I force the code to take the other path 
> ({{shutdownSession(new ConnectionClosedException("Connection closed by 
> peer"))}}), the client still just hangs forever. Something, presumably 
> {{SSLIOSession}} itself, is forgetting to invoke the appropriate callback to 
> fail the handshake in this situation.



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

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

Reply via email to