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: [email protected]
For additional commands, e-mail: [email protected]