eclipse-ee4j / eclipse-ee4j/jersey
EntityInputStream#isEmpty incorrect logic/thrown exception with Undertow
- Dominant language
- Java
- Stars
- 730
- Forks
- 382
- PR merge metrics
- No merged PRs in 30d
Description
I'm using Undertow with Jersey, problem is when exception is thrown from a controller and Jersey is trying generate an error.
I think the problem here is how Jersey is trying to recognize that stream is empty:
```
if (in.available() > 0) {
return false;
}
```
`available` returns 0 but method continues, then `read` is invoked which throws exception "Stream is closed".
```
11:03:11.772 [XNIO-2 task-3] ERROR io.undertow.request - UT005022: Exception generating error page /error
javax.servlet.ServletException: javax.ws.rs.ProcessingException: java.io.IOException: UT010029: Stream is closed
at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:489)
at org.glassfish.jersey.servlet.ServletContainer.serviceImpl(ServletContainer.java:408)
at org.glassfish.jersey.servlet.ServletContainer.doFilter(ServletContainer.java:583)
at org.glassfish.jersey.servlet.ServletContainer.doFilter(ServletContainer.java:524)
at org.glassfish.jersey.servlet.ServletContainer.doFilter(ServletContainer.java:461)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:274)
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchToPath(ServletInitialHandler.java:209)
at io.undertow.servlet.spec.RequestDispatcherImpl.error(RequestDispatcherImpl.java:480)
at io.undertow.servlet.spec.RequestDispatcherImpl.error(RequestDispatcherImpl.java:413)
at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:319)
at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:81)
at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:138)
at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)
at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272)
at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:104)
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:211)
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:809)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: javax.ws.rs.ProcessingException: java.io.IOException: UT010029: Stream is closed
at org.glassfish.jersey.message.internal.EntityInputStream.isEmpty(EntityInputStream.java:217)
at org.glassfish.jersey.message.internal.InboundMessageContext.hasEntity(InboundMessageContext.java:772)
at org.glassfish.jersey.logging.ServerLoggingFilter.filter(ServerLoggingFilter.java:106)
at org.glassfish.jersey.server.ContainerFilteringStage.apply(ContainerFilteringStage.java:132)
at org.glassfish.jersey.server.ContainerFilteringStage.apply(ContainerFilteringStage.java:68)
at org.glassfish.jersey.process.internal.Stages.process(Stages.java:197)
at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:318)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)
at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305)
at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154)
at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:473)
... 29 common frames omitted
Caused by: java.io.IOException: UT010029: Stream is closed
at io.undertow.servlet.spec.ServletInputStreamImpl.read(ServletInputStreamImpl.java:137)
at io.undertow.servlet.spec.ServletInputStreamImpl.read(ServletInputStreamImpl.java:131)
at io.undertow.servlet.spec.ServletInputStreamImpl.read(ServletInputStreamImpl.java:122)
at org.glassfish.jersey.message.internal.EntityInputStream.isEmpty(EntityInputStream.java:200)
... 44 common frames omitted
```
#### Affected Versions
[2.25.1]
Contributor guide
Assessment
This issue has not been assessed yet.