eclipse-ee4j / eclipse-ee4j/jersey

Errors after abort SseListener before all events are received

Open
#3,434 3 comments 0 reactions 0 assignees View on GitHub
Component: core Priority: Major sse Type: Bug
Dominant language
Java
Stars
730
Forks
382
PR merge metrics
No merged PRs in 30d

Description

If I abort an SseListener before all events are received,
some of the following requests run into exceptions like:

javax.ws.rs.client.ResponseProcessingException: Failed to convert a response into an exception.
Caused by: javax.ws.rs.ProcessingException: Failed to buffer the message content input stream.
Caused by: java.io.IOException: Invalid Http response
or
javax.ws.rs.ProcessingException: java.net.SocketException: Connection reset
or
org.apache.http.client.ClientProtocolException
Caused by: org.apache.http.ProtocolException: The server failed to respond with a valid HTTP response

On the server side I get the exception:
2016-09-15 13:23:54.178 INFO 7207 — [pool-1-thread-1] o.apache.coyote.http11.Http11Processor : An error occurred in processing while on a non-container thread. The connection will be closed immediately
java.io.IOException: Datenübergabe unterbrochen (broken pipe)
at sun.nio.ch.FileDispatcherImpl.write0(Native Method) ~[na:1.8.0_11]
at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:47) ~[na:1.8.0_11]
at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93) ~[na:1.8.0_11]
at sun.nio.ch.IOUtil.write(IOUtil.java:65) ~[na:1.8.0_11]
at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:466) ~[na:1.8.0_11]
at org.apache.tomcat.util.net.NioChannel.write(NioChannel.java:134) ~[tomcat-embed-core-8.5.5.jar:8.5.5]
at org.apache.tomcat.util.net.NioBlockingSelector.write(NioBlockingSelector.java:101) ~[tomcat-embed-core-8.5.5.jar:8.5.5]
at org.apache.tomcat.util.net.NioSelectorPool.write(NioSelectorPool.java:157) ~[tomcat-embed-core-8.5.5.jar:8.5.5]
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.doWrite(NioEndpoint.java:1221) ~[tomcat-embed-core-8.5.5.jar:8.5.5]
at org.apache.tomcat.util.net.SocketWrapperBase.flushBlocking(SocketWrapperBase.java:451) ~[tomcat-embed-core-8.5.5.jar:8.5.5]
at org.apache.tomcat.util.net.SocketWrapperBase.flush(SocketWrapperBase.java:441) ~[tomcat-embed-core-8.5.5.jar:8.5.5]
at org.apache.coyote.http11.Http11OutputBuffer.flushBuffer(Http11OutputBuffer.java:514) ~[tomcat-embed-core-8.5.5.jar:8.5.5]
at org.apache.coyote.http11.Http11OutputBuffer.flush(Http11OutputBuffer.java:243) ~[tomcat-embed-core-8.5.5.jar:8.5.5]
at org.apache.coyote.http11.Http11Processor.flush(Http11Processor.java:1494) ~[tomcat-embed-core-8.5.5.jar:8.5.5]
at org.apache.coyote.AbstractProcessor.action(AbstractProcessor.java:284) ~[tomcat-embed-core-8.5.5.jar:8.5.5]
at org.apache.coyote.Response.action(Response.java:167) [tomcat-embed-core-8.5.5.jar:8.5.5]
at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:336) [tomcat-embed-core-8.5.5.jar:8.5.5]
at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:303) [tomcat-embed-core-8.5.5.jar:8.5.5]
at org.apache.catalina.connector.CoyoteOutputStream.flush(CoyoteOutputStream.java:109) [tomcat-embed-core-8.5.5.jar:8.5.5]
at org.glassfish.jersey.servlet.internal.ResponseWriter$NonCloseableOutputStreamWrapper.flush(ResponseWriter.java:330) [jersey-container-servlet-core-2.23.2.jar:na]
at org.glassfish.jersey.message.internal.CommittingOutputStream.flush(CommittingOutputStream.java:292) [jersey-common-2.23.2.jar:na]

During some of the following requests the http client receives garbage. It seems like the I/O buffer contains data of the previous request.

This produces such wire log:

13:10:46.782 [Thread-20] DEBUG org.apache.http.headers - >> GET /long?length=20 HTTP/1.1
13:10:46.783 [Thread-20] DEBUG org.apache.http.headers - >> Accept: **/**
13:10:46.784 [Thread-20] DEBUG org.apache.http.headers - >> Accept-Language: de
13:10:46.786 [Thread-20] DEBUG org.apache.http.headers - >> Host: localhost:8080
13:10:46.788 [Thread-20] DEBUG org.apache.http.headers - >> Connection: Keep-Alive
13:10:46.796 [Thread-20] DEBUG org.apache.http.wire - << "14[\r][\n]"
13:10:46.806 [Thread-20] DEBUG org.apache.http.impl.conn.DefaultHttpResponseParser - Garbage in response: 14
13:10:46.810 [Thread-20] DEBUG org.apache.http.wire - << "01234567890123456789[\r][\n]"
13:10:46.811 [Thread-20] DEBUG org.apache.http.impl.conn.DefaultHttpResponseParser - Garbage in response: 01234567890123456789
13:10:46.813 [Thread-20] DEBUG org.apache.http.wire - << "0[\r][\n]"
13:10:46.820 [Thread-20] DEBUG org.apache.http.impl.conn.DefaultHttpResponseParser - Garbage in response: 0
13:10:46.824 [Thread-20] DEBUG org.apache.http.wire - << "[\r][\n]"
13:10:46.836 [Thread-20] DEBUG org.apache.http.impl.conn.DefaultHttpResponseParser - Garbage in response:
13:11:46.906 [Thread-20] DEBUG org.apache.http.impl.conn.DefaultClientConnection - Connection 0.0.0.0:47265<->127.0.0.1:8080 closed
13:11:46.906 [Thread-20] DEBUG org.apache.http.impl.conn.DefaultClientConnection - Connection 0.0.0.0:47265<->127.0.0.1:8080 shut down
13:11:46.906 [Thread-20] DEBUG org.apache.http.impl.conn.BasicClientConnectionManager - Releasing connection org.apache.http.impl.conn.ManagedClientConnectionImpl@37a96452Exception in thread "Thread-20" org.apache.http.client.ClientProtocolException

To reproduce the error a sample application is provided at the following location:
[https://github.com/morca/sse-test](https://github.com/morca/sse-test)

The error occurs if I use tomcat 8.5.5 or newer (comes with spring-boot 1.4.0), in tomcat 8.0.36 there are no problems.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.