Author: markt Date: Mon Mar 27 08:02:38 2017 New Revision: 1788841 URL: http://svn.apache.org/viewvc?rev=1788841&view=rev Log: Total data sent should agree with any content-length header Found with the h2spec tool written by Moto Ishizawa.
Modified: 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/java/org/apache/coyote/http2/StreamProcessor.java 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=1788841&r1=1788840&r2=1788841&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java (original) +++ tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java Mon Mar 27 08:02:38 2017 @@ -1318,6 +1318,7 @@ class Http2UpgradeHandler extends Abstra public ByteBuffer startRequestBodyFrame(int streamId, int payloadSize) throws Http2Exception { Stream stream = getStream(streamId, true); stream.checkState(FrameType.DATA); + stream.receivedData(payloadSize); return stream.getInputByteBuffer(); } 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=1788841&r1=1788840&r2=1788841&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties (original) +++ tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties Mon Mar 27 08:02:38 2017 @@ -75,6 +75,7 @@ pingManager.roundTripTime=Connection [{0 stream.closed=Connection [{0}], Stream [{1}], Unable to write to stream once it has been closed stream.header.case=Connection [{0}], Stream [{1}], HTTP header name [{2}] must be in lower case stream.header.connection=Connection [{0}], Stream [{1}], HTTP header [connection] is not permitted in an HTTP/2 request +stream.header.contentLength=Connection [{0}], Stream [{1}], The content length header value [{2}] does not agree with the size of the data received [{3}] stream.header.debug=Connection [{0}], Stream [{1}], HTTP header [{2}], Value [{3}] stream.header.duplicate=Connection [{0}], Stream [{1}], received multiple [{3}] headers stream.header.noPath=Connection [{0}], Stream [{1}], The [:path] pseudo header was empty 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=1788841&r1=1788840&r2=1788841&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http2/Stream.java (original) +++ tomcat/trunk/java/org/apache/coyote/http2/Stream.java Mon Mar 27 08:02:38 2017 @@ -54,6 +54,7 @@ class Stream extends AbstractStream impl } private volatile int weight = Constants.DEFAULT_WEIGHT; + private volatile long contentLengthReceived = 0; private final Http2UpgradeHandler handler; private final StreamStateMachine state; @@ -446,7 +447,24 @@ class Stream extends AbstractStream impl } - final void receivedEndOfStream() { + final void receivedData(int payloadSize) throws ConnectionException { + contentLengthReceived += payloadSize; + long contentLengthHeader = coyoteRequest.getContentLengthLong(); + if (contentLengthHeader > -1 && contentLengthReceived > contentLengthHeader) { + throw new ConnectionException(sm.getString("stream.header.contentLength", + getConnectionId(), getIdentifier(), Long.valueOf(contentLengthHeader), + Long.valueOf(contentLengthReceived)), Http2Error.PROTOCOL_ERROR); + } + } + + + final void receivedEndOfStream() throws ConnectionException { + long contentLengthHeader = coyoteRequest.getContentLengthLong(); + if (contentLengthHeader > -1 && contentLengthReceived != contentLengthHeader) { + throw new ConnectionException(sm.getString("stream.header.contentLength", + getConnectionId(), getIdentifier(), Long.valueOf(contentLengthHeader), + Long.valueOf(contentLengthReceived)), Http2Error.PROTOCOL_ERROR); + } state.receivedEndOfStream(); if (inputBuffer != null) { inputBuffer.notifyEof(); Modified: tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java?rev=1788841&r1=1788840&r2=1788841&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java (original) +++ tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java Mon Mar 27 08:02:38 2017 @@ -134,7 +134,11 @@ class StreamProcessor extends AbstractPr @Override protected final void setRequestBody(ByteChunk body) { stream.getInputBuffer().insertReplayedBody(body); - stream.receivedEndOfStream(); + try { + stream.receivedEndOfStream(); + } catch (ConnectionException e) { + // Exception will not be thrown in this case + } } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org