Joerg Hoh created FELIX-6434:
--------------------------------

             Summary: [Jetty] errorhandler can commit the response twice
                 Key: FELIX-6434
                 URL: https://issues.apache.org/jira/browse/FELIX-6434
             Project: Felix
          Issue Type: Improvement
          Components: HTTP Service
    Affects Versions: http.bridge-4.1.2
            Reporter: Joerg Hoh



We saw this exception in our logs:

{code}
28.05.2021 06:35:32.758 ERROR [qtp1872055084-43557] org.apache.felix.http.jetty 
Exception while processing request to /crx/de/endorsed/extjs/ext-all-debug.js 
(org.eclipse.jetty.io.EofException)
org.eclipse.jetty.io.EofException: null
at org.eclipse.jetty.io.ChannelEndPoint.flush(ChannelEndPoint.java:279) 
[org.apache.felix.http.jetty:4.1.2.T2020102214]
at org.eclipse.jetty.io.WriteFlusher.flush(WriteFlusher.java:422) 
[org.apache.felix.http.jetty:4.1.2.T2020102214]
at org.eclipse.jetty.io.WriteFlusher.completeWrite(WriteFlusher.java:378) 
[org.apache.felix.http.jetty:4.1.2.T2020102214]
at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:119) 
[org.apache.felix.http.jetty:4.1.2.T2020102214]
java.lang.IllegalStateException: Committed
at org.eclipse.jetty.server.HttpChannel.resetBuffer(HttpChannel.java:917) 
[org.apache.felix.http.jetty:4.1.2.T2020102214]
at org.eclipse.jetty.server.HttpOutput.resetBuffer(HttpOutput.java:1418) 
[org.apache.felix.http.jetty:4.1.2.T2020102214]
at org.eclipse.jetty.server.Response.resetBuffer(Response.java:1180) 
[org.apache.felix.http.jetty:4.1.2.T2020102214]
at 
javax.servlet.ServletResponseWrapper.resetBuffer(ServletResponseWrapper.java:195)
 [org.apache.felix.http.servlet-api:1.1.2]
at 
org.apache.felix.http.base.internal.dispatch.ServletResponseWrapper.sendError(ServletResponseWrapper.java:67)
 [org.apache.felix.http.jetty:4.1.2.T2020102214]
at 
org.apache.felix.http.base.internal.dispatch.ServletResponseWrapper.sendError(ServletResponseWrapper.java:61)
 [org.apache.felix.http.jetty:4.1.2.T2020102214]
at 
org.apache.felix.http.base.internal.dispatch.Dispatcher$1.doFilter(Dispatcher.java:155)
 [org.apache.felix.http.jetty:4.1.2.T2020102214]
at 
org.apache.felix.http.base.internal.whiteboard.WhiteboardManager$2.doFilter(WhiteboardManager.java:1002)
 [org.apache.felix.http.jetty:4.1.2.T2020102214]
at 
com.adobe.granite.auth.oauth.impl.OAuthCallbackFilter.doFilter(OAuthCallbackFilter.java:69)
 [com.adobe.granite.auth.oauth:1.7.2]
at 
org.apache.felix.http.base.internal.handler.PreprocessorHandler.handle(PreprocessorHandler.java:137)
 [org.apache.felix.http.jetty:4.1.2.T2020102214]
at 
org.apache.felix.http.base.internal.whiteboard.WhiteboardManager$2.doFilter(WhiteboardManager.java:1008)
 [org.apache.felix.http.jetty:4.1.2.T2020102214]
at 
org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:129)
 [org.apache.felix.http.jetty:4.1.2.T2020102214]
at 
org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:375)
 [org.apache.felix.http.jetty:4.1.2.T2020102214]
at 
org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:806)
 [org.apache.felix.http.jetty:4.1.2.T2020102214]
at 
org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:938)
 [org.apache.felix.http.jetty:4.1.2.T2020102214]
at java.base/java.lang.Thread.run(Thread.java:834)
{code}

Checking the code it seems that the {{ServletResponseWrapper.sendError()}} [1] 
does a {{resetBuffer()}}, which according to its javadoc [2] can throw an 
{{IllegalStateException}} if the response has been already committed.

Therefor the call to {{resetBuffer()}} should be guarded by a check of 
{{isCommitted()}} and invoke it only in case the response is not yet committed. 

Probably it also makes sense to not to set the statuscode because it also does 
not have any effect anymore.




[1] 
https://github.com/apache/felix-dev/blob/master/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/ServletResponseWrapper.java#L65
[2] 
https://javaee.github.io/javaee-spec/javadocs/javax/servlet/ServletResponse.html#resetBuffer--




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

Reply via email to