This is an automated email from the ASF dual-hosted git repository. markt pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/master by this push: new 4cfe667 Additional fix required for async I/O and HTTP/2 'swallow output' 4cfe667 is described below commit 4cfe66798144b4dd3cac5b13d9059857a91c3443 Author: Mark Thomas <ma...@apache.org> AuthorDate: Mon Apr 8 23:00:13 2019 +0100 Additional fix required for async I/O and HTTP/2 'swallow output' --- java/org/apache/coyote/http2/Stream.java | 15 ++++++++++++--- java/org/apache/coyote/http2/StreamProcessor.java | 8 ++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/java/org/apache/coyote/http2/Stream.java b/java/org/apache/coyote/http2/Stream.java index 7337eb9..0bb12a0 100644 --- a/java/org/apache/coyote/http2/Stream.java +++ b/java/org/apache/coyote/http2/Stream.java @@ -607,10 +607,10 @@ class Stream extends AbstractStream implements HeaderEmitter { final void receivedEndOfStream() throws ConnectionException { - long contentLengthHeader = coyoteRequest.getContentLengthLong(); - if (contentLengthHeader > -1 && contentLengthReceived != contentLengthHeader) { + if (isContentLengthInconsistent()) { throw new ConnectionException(sm.getString("stream.header.contentLength", - getConnectionId(), getIdentifier(), Long.valueOf(contentLengthHeader), + getConnectionId(), getIdentifier(), + Long.valueOf(coyoteRequest.getContentLengthLong()), Long.valueOf(contentLengthReceived)), Http2Error.PROTOCOL_ERROR); } state.receivedEndOfStream(); @@ -620,6 +620,15 @@ class Stream extends AbstractStream implements HeaderEmitter { } + final boolean isContentLengthInconsistent() { + long contentLengthHeader = coyoteRequest.getContentLengthLong(); + if (contentLengthHeader > -1 && contentLengthReceived != contentLengthHeader) { + return true; + } + return false; + } + + final void sentHeaders() { state.sentHeaders(); } diff --git a/java/org/apache/coyote/http2/StreamProcessor.java b/java/org/apache/coyote/http2/StreamProcessor.java index 5d1e60d..1e8f6a7 100644 --- a/java/org/apache/coyote/http2/StreamProcessor.java +++ b/java/org/apache/coyote/http2/StreamProcessor.java @@ -417,6 +417,14 @@ class StreamProcessor extends AbstractProcessor { private void endRequest() throws IOException { if (!stream.isInputFinished() && getErrorState().isIoAllowed()) { + if (handler.hasAsyncIO() && !stream.isContentLengthInconsistent()) { + // Need an additional checks for asyncIO as the end of stream + // might have been set on the header frame but not processed + // yet. Checking for this here so the extra processing only + // occurs on the potential error condition rather than on every + // request. + return; + } // The request has been processed but the request body has not been // fully read. This typically occurs when Tomcat rejects an upload // of some form (e.g. PUT or POST). Need to tell the client not to --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org