CelestiaTheDryad opened a new pull request, #515:
URL: https://github.com/apache/httpcomponents-core/pull/515
Using version 5.3.1
We were experiencing spontaneous closures of our HTTP servers from this
library. I traced the behavior to this stacktrace. It is caused by an exception
occurring early in the request processing pipeline causing uninitialized state
to be referenced.
```
java.lang.NullPointerException: Cannot invoke
"org.apache.hc.core5.http.nio.AsyncServerExchangeHandler.failed(java.lang.Exception)"
because "this.exchangeHandler" is null
at
org.apache.hc.core5.http.impl.nio.ServerHttp1StreamHandler.failed(ServerHttp1StreamHandler.java:332)
at
org.apache.hc.core5.http.impl.nio.ServerHttp1StreamDuplexer.disconnected(ServerHttp1StreamDuplexer.java:225)
at
org.apache.hc.core5.http.impl.nio.AbstractHttp1StreamDuplexer.onDisconnect(AbstractHttp1StreamDuplexer.java:412)
at
org.apache.hc.core5.http.impl.nio.AbstractHttp1IOEventHandler.disconnected(AbstractHttp1IOEventHandler.java:95)
at
org.apache.hc.core5.http.impl.nio.ServerHttp1IOEventHandler.disconnected(ServerHttp1IOEventHandler.java:41)
at
org.apache.hc.core5.reactor.InternalDataChannel.disconnected(InternalDataChannel.java:205)
at
org.apache.hc.core5.reactor.SingleCoreIOReactor.processClosedSessions(SingleCoreIOReactor.java:229)
at
org.apache.hc.core5.reactor.SingleCoreIOReactor.doTerminate(SingleCoreIOReactor.java:104)
at
org.apache.hc.core5.reactor.AbstractSingleCoreIOReactor.execute(AbstractSingleCoreIOReactor.java:99)
at
org.apache.hc.core5.reactor.IOReactorWorker.run(IOReactorWorker.java:44)
at java.base/java.lang.Thread.run(Thread.java:840)
```
This exception is not handled in this stack, and causes the worker thread to
exit. After all worker threads in the server exits, the server closes.
An example processing error that leads to this behavior:
```
org.apache.hc.core5.http.UnsupportedHttpVersionException: Unsupported
version: HTTP/2.1
at
org.apache.hc.core5.http.impl.nio.ServerHttp1StreamHandler.consumeHeader(ServerHttp1StreamHandler.java:255)
at
org.apache.hc.core5.http.impl.nio.ServerHttp1StreamDuplexer.consumeHeader(ServerHttp1StreamDuplexer.java:372)
at
org.apache.hc.core5.http.impl.nio.ServerHttp1StreamDuplexer.consumeHeader(ServerHttp1StreamDuplexer.java:81)
at
org.apache.hc.core5.http.impl.nio.AbstractHttp1StreamDuplexer.onInput(AbstractHttp1StreamDuplexer.java:299)
at
org.apache.hc.core5.http.impl.nio.AbstractHttp1IOEventHandler.inputReady(AbstractHttp1IOEventHandler.java:64)
at
org.apache.hc.core5.http.impl.nio.ServerHttp1IOEventHandler.inputReady(ServerHttp1IOEventHandler.java:41)
at
org.apache.hc.core5.reactor.InternalDataChannel.onIOEvent(InternalDataChannel.java:143)
at
org.apache.hc.core5.reactor.InternalChannel.handleIOEvent(InternalChannel.java:51)
at
org.apache.hc.core5.reactor.SingleCoreIOReactor.processEvents(SingleCoreIOReactor.java:176)
at
org.apache.hc.core5.reactor.SingleCoreIOReactor.doExecute(SingleCoreIOReactor.java:125)
at
org.apache.hc.core5.reactor.AbstractSingleCoreIOReactor.execute(AbstractSingleCoreIOReactor.java:92)
at
org.apache.hc.core5.reactor.IOReactorWorker.run(IOReactorWorker.java:44)
at java.base/java.lang.Thread.run(Thread.java:840)
```
This PR includes the fix which I have deployed in our environment and
appears to fix the issue in the HTTP/1 handler. We did not detect an issue in
the HTTP/2 handler.
As a separate note, I would expect the closure of the HTTP server to be
passed to the HTTP server exception listener. As it stands there was no
indication the server closed. It was only detected by clients reporting errors.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]