Author: markt
Date: Tue Oct 25 14:14:08 2016
New Revision: 1766535
URL: http://svn.apache.org/viewvc?rev=1766535&view=rev
Log:
Fail earlier if trailer headers don't end the stream
Modified:
tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java
tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java
tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties
tomcat/trunk/java/org/apache/coyote/http2/Stream.java
tomcat/trunk/test/org/apache/coyote/http2/Http2TestBase.java
Modified: tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java?rev=1766535&r1=1766534&r2=1766535&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java Tue Oct 25
14:14:08 2016
@@ -199,11 +199,13 @@ class Http2Parser {
private void readHeadersFrame(int streamId, int flags, int payloadSize)
throws Http2Exception, IOException {
+ headersEndStream = Flags.isEndOfStream(flags);
+
if (hpackDecoder == null) {
hpackDecoder = output.getHpackDecoder();
}
try {
- hpackDecoder.setHeaderEmitter(output.headersStart(streamId));
+ hpackDecoder.setHeaderEmitter(output.headersStart(streamId,
headersEndStream));
} catch (StreamException se) {
swallow(streamId, payloadSize, false);
throw se;
@@ -247,8 +249,6 @@ class Http2Parser {
swallow(streamId, padLength, true);
- headersEndStream = Flags.isEndOfStream(flags);
-
if (Flags.isEndOfHeaders(flags)) {
onHeadersComplete(streamId);
} else {
@@ -638,7 +638,7 @@ class Http2Parser {
void swallowedPadding(int streamId, int paddingLength) throws
ConnectionException, IOException;
// Header frames
- HeaderEmitter headersStart(int streamId) throws Http2Exception;
+ HeaderEmitter headersStart(int streamId, boolean headersEndStream)
throws Http2Exception;
void headersEnd(int streamId) throws ConnectionException;
// Priority frames (also headers)
Modified: tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java?rev=1766535&r1=1766534&r2=1766535&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java
(original)
+++ tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java Tue Oct
25 14:14:08 2016
@@ -1271,14 +1271,14 @@ class Http2UpgradeHandler extends Abstra
@Override
- public HeaderEmitter headersStart(int streamId) throws Http2Exception {
+ public HeaderEmitter headersStart(int streamId, boolean headersEndStream)
throws Http2Exception {
if (connectionState.get().isNewStreamAllowed()) {
Stream stream = getStream(streamId, false);
if (stream == null) {
stream = createRemoteStream(streamId);
}
stream.checkState(FrameType.HEADERS);
- stream.receivedStartOfHeaders();
+ stream.receivedStartOfHeaders(headersEndStream);
closeIdleStreams(streamId);
if (localSettings.getMaxConcurrentStreams() <
activeRemoteStreamCount.incrementAndGet()) {
activeRemoteStreamCount.decrementAndGet();
Modified: tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties?rev=1766535&r1=1766534&r2=1766535&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties Tue Oct
25 14:14:08 2016
@@ -77,6 +77,7 @@ stream.notWritable=Connection [{0}], Str
stream.reprioritisation.debug=Connection [{0}], Stream [{1}], Exclusive [{2}],
Parent [{3}], Weight [{4}]
stream.reset.debug=Connection [{0}], Stream [{1}], Reset due to [{2}]
stream.reset.fail=Connection [{0}], Stream [{1}], Failed to reset stream
+stream.trialerHeader.noEndOfStream=Connection [{0}], Stream [{1}], The trailer
headers did not include the end of stream flag
stream.write=Connection [{0}], Stream [{1}]
stream.inputBuffer.copy=Copying [{0}] bytes from inBuffer to outBuffer
Modified: tomcat/trunk/java/org/apache/coyote/http2/Stream.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/Stream.java?rev=1766535&r1=1766534&r2=1766535&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/Stream.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/Stream.java Tue Oct 25 14:14:08
2016
@@ -356,15 +356,21 @@ class Stream extends AbstractStream impl
}
- final void receivedStartOfHeaders() {
+ final void receivedStartOfHeaders(boolean headersEndStream) throws
Http2Exception {
if (headerState == HEADER_STATE_START) {
headerState = HEADER_STATE_PSEUDO;
handler.getHpackDecoder().setMaxHeaderCount(handler.getMaxHeaderCount());
handler.getHpackDecoder().setMaxHeaderSize(handler.getMaxHeaderSize());
} else if (headerState == HEADER_STATE_PSEUDO || headerState ==
HEADER_STATE_REGULAR) {
- headerState = HEADER_STATE_TRAILER;
-
handler.getHpackDecoder().setMaxHeaderCount(handler.getMaxTrailerCount());
-
handler.getHpackDecoder().setMaxHeaderSize(handler.getMaxTrailerSize());
+ // Trailer headers MUST include the end of stream flag
+ if (headersEndStream) {
+ headerState = HEADER_STATE_TRAILER;
+
handler.getHpackDecoder().setMaxHeaderCount(handler.getMaxTrailerCount());
+
handler.getHpackDecoder().setMaxHeaderSize(handler.getMaxTrailerSize());
+ } else {
+ throw new
ConnectionException(sm.getString("stream.trialerHeader.noEndOfStream",
+ getConnectionId(), getIdentifier()),
Http2Error.PROTOCOL_ERROR);
+ }
}
// Parser will catch attempt to send a headers frame after the stream
// has closed.
Modified: tomcat/trunk/test/org/apache/coyote/http2/Http2TestBase.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/coyote/http2/Http2TestBase.java?rev=1766535&r1=1766534&r2=1766535&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/coyote/http2/Http2TestBase.java (original)
+++ tomcat/trunk/test/org/apache/coyote/http2/Http2TestBase.java Tue Oct 25
14:14:08 2016
@@ -895,7 +895,7 @@ public abstract class Http2TestBase exte
@Override
- public HeaderEmitter headersStart(int streamId) {
+ public HeaderEmitter headersStart(int streamId, boolean
headersEndStream) {
lastStreamId = Integer.toString(streamId);
trace.append(lastStreamId + "-HeadersStart\n");
return this;
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]