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 38ef1f6 Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=63223 38ef1f6 is described below commit 38ef1f624aaf045458b6fe055742fa680a96a9e1 Author: Mark Thomas <ma...@apache.org> AuthorDate: Thu Mar 7 10:50:05 2019 +0000 Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=63223 Include pushed streams in the count of currently open streams Reject (ignore) a pushed stream if max streams has been reached Correctly track the state of a pushed stream --- java/org/apache/coyote/http2/Http2UpgradeHandler.java | 8 ++++++++ java/org/apache/coyote/http2/Stream.java | 5 +++++ java/org/apache/coyote/http2/StreamStateMachine.java | 8 +++++++- webapps/docs/changelog.xml | 4 ++++ 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/java/org/apache/coyote/http2/Http2UpgradeHandler.java b/java/org/apache/coyote/http2/Http2UpgradeHandler.java index 4189a3f..349a4c8 100644 --- a/java/org/apache/coyote/http2/Http2UpgradeHandler.java +++ b/java/org/apache/coyote/http2/Http2UpgradeHandler.java @@ -551,6 +551,7 @@ class Http2UpgradeHandler extends AbstractStream implements InternalHttpUpgradeH synchronized (socketWrapper) { doWriteHeaders(stream, pushedStreamId, mimeHeaders, endOfStream, payloadSize); } + stream.sentHeaders(); if (endOfStream) { stream.sentEndOfStream(); } @@ -1177,6 +1178,13 @@ class Http2UpgradeHandler extends AbstractStream implements InternalHttpUpgradeH void push(Request request, Stream associatedStream) throws IOException { + if (localSettings.getMaxConcurrentStreams() < activeRemoteStreamCount.incrementAndGet()) { + // If there are too many open streams, simply ignore the push + // request. + activeRemoteStreamCount.decrementAndGet(); + return; + } + Stream pushStream; // Synchronized since PUSH_PROMISE frames have to be sent in order. Once diff --git a/java/org/apache/coyote/http2/Stream.java b/java/org/apache/coyote/http2/Stream.java index 3b14bb6..32c90b8 100644 --- a/java/org/apache/coyote/http2/Stream.java +++ b/java/org/apache/coyote/http2/Stream.java @@ -620,6 +620,11 @@ class Stream extends AbstractStream implements HeaderEmitter { } + final void sentHeaders() { + state.sentHeaders(); + } + + final void sentEndOfStream() { streamOutputBuffer.endOfStreamSent = true; state.sentEndOfStream(); diff --git a/java/org/apache/coyote/http2/StreamStateMachine.java b/java/org/apache/coyote/http2/StreamStateMachine.java index 7b3c215..0da3a2a 100644 --- a/java/org/apache/coyote/http2/StreamStateMachine.java +++ b/java/org/apache/coyote/http2/StreamStateMachine.java @@ -53,6 +53,12 @@ class StreamStateMachine { } + final synchronized void sentHeaders() { + // No change if currently OPEN + stateChange(State.RESERVED_LOCAL, State.HALF_CLOSED_REMOTE); + } + + final synchronized void receivedStartOfHeaders() { stateChange(State.IDLE, State.OPEN); stateChange(State.RESERVED_REMOTE, State.HALF_CLOSED_LOCAL); @@ -170,7 +176,7 @@ class StreamStateMachine { Http2Error.PROTOCOL_ERROR, FrameType.PRIORITY, FrameType.RST, FrameType.WINDOW_UPDATE), - RESERVED_REMOTE (false, false, true, true, + RESERVED_REMOTE (false, true, true, true, Http2Error.PROTOCOL_ERROR, FrameType.HEADERS, FrameType.PRIORITY, FrameType.RST), diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index c831843..3331c08 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -123,6 +123,10 @@ Correct an error in the request validation that meant that HTTP/2 push requests always resulted in a 400 response. (markt) </fix> + <fix> + <bug>63223</bug>: Correctly account for push requests when tracking + currently active HTTP/2 streams. (markt) + </fix> </changelog> </subsection> <subsection name="WebSocket"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org