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

Reply via email to