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: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org