You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2015/06/08 22:53:39 UTC
svn commit: r1684277 - in /tomcat/trunk:
java/org/apache/coyote/http2/FrameType.java
java/org/apache/coyote/http2/Http2Parser.java
java/org/apache/coyote/http2/Http2UpgradeHandler.java
test/org/apache/coyote/http2/TestHttp2Section_4_2.java
Author: markt
Date: Mon Jun 8 20:53:39 2015
New Revision: 1684277
URL: http://svn.apache.org/r1684277
Log:
Invalid priority length is only a stream error
Modified:
tomcat/trunk/java/org/apache/coyote/http2/FrameType.java
tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java
tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java
tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_4_2.java
Modified: tomcat/trunk/java/org/apache/coyote/http2/FrameType.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/FrameType.java?rev=1684277&r1=1684276&r2=1684277&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/FrameType.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/FrameType.java Mon Jun 8 20:53:39 2015
@@ -22,17 +22,17 @@ import org.apache.tomcat.util.res.String
public enum FrameType {
- DATA (0, false, true, null),
- HEADERS (1, false, true, null),
- PRIORITY (2, false, true, (x) -> x == 5),
- RST (3, false, true, (x) -> x == 4),
- SETTINGS (4, true, false, (x) -> x % 6 == 0),
- PUSH_PROMISE (5, false, true, (x) -> x >= 4),
- PING (6, true, false, (x) -> x == 8),
- GOAWAY (7, true, false, (x) -> x >= 8),
- WINDOW_UPDATE (8, true, true, (x) -> x == 4),
- CONTINUATION (9, false, true, null),
- UNKNOWN (256, true, true, null);
+ DATA (0, false, true, null, false),
+ HEADERS (1, false, true, null, true),
+ PRIORITY (2, false, true, (x) -> x == 5, false),
+ RST (3, false, true, (x) -> x == 4, false),
+ SETTINGS (4, true, false, (x) -> x % 6 == 0, true),
+ PUSH_PROMISE (5, false, true, (x) -> x >= 4, true),
+ PING (6, true, false, (x) -> x == 8, false),
+ GOAWAY (7, true, false, (x) -> x >= 8, false),
+ WINDOW_UPDATE (8, true, true, (x) -> x == 4, false),
+ CONTINUATION (9, false, true, null, true),
+ UNKNOWN (256, true, true, null, false);
private static final StringManager sm = StringManager.getManager(FrameType.class);
@@ -40,14 +40,16 @@ public enum FrameType {
private final boolean streamZero;
private final boolean streamNonZero;
private final IntPredicate payloadSizeValidator;
+ private final boolean payloadErrorFatal;
private FrameType(int id, boolean streamZero, boolean streamNonZero,
- IntPredicate payloadSizeValidator) {
+ IntPredicate payloadSizeValidator, boolean payloadErrorFatal) {
this.id = id;
this.streamZero = streamZero;
this.streamNonZero = streamNonZero;
this.payloadSizeValidator = payloadSizeValidator;
+ this.payloadErrorFatal = payloadErrorFatal;
}
@@ -64,11 +66,17 @@ public enum FrameType {
}
- public void checkPayloadSize(int payloadSize) throws Http2Exception {
+ public void checkPayloadSize(int streamId, int payloadSize) throws Http2Exception {
if (payloadSizeValidator != null && !payloadSizeValidator.test(payloadSize)) {
- throw new ConnectionError(sm.getString("frameType.checkPayloadSize",
- Integer.toString(payloadSize), this),
- Error.FRAME_SIZE_ERROR);
+ if (payloadErrorFatal) {
+ throw new ConnectionError(sm.getString("frameType.checkPayloadSize",
+ Integer.toString(payloadSize), this),
+ Error.FRAME_SIZE_ERROR);
+ } else {
+ throw new StreamError(sm.getString("frameType.checkPayloadSize",
+ Integer.toString(payloadSize), this),
+ Error.FRAME_SIZE_ERROR, streamId);
+ }
}
}
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=1684277&r1=1684276&r2=1684277&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java Mon Jun 8 20:53:39 2015
@@ -435,7 +435,7 @@ class Http2Parser {
}
frameType.checkStream(streamId);
- frameType.checkPayloadSize(payloadSize);
+ frameType.checkPayloadSize(streamId, payloadSize);
}
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=1684277&r1=1684276&r2=1684277&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java Mon Jun 8 20:53:39 2015
@@ -172,7 +172,7 @@ public class Http2UpgradeHandler extends
String base64Settings = stream.getCoyoteRequest().getHeader(HTTP2_SETTINGS_HEADER);
byte[] settings = Base64.decodeBase64(base64Settings);
- FrameType.SETTINGS.checkPayloadSize(settings.length);
+ FrameType.SETTINGS.checkPayloadSize(1, settings.length);
for (int i = 0; i < settings.length % 6; i++) {
int id = ByteUtil.getTwoBytes(settings, i * 6);
Modified: tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_4_2.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_4_2.java?rev=1684277&r1=1684276&r2=1684277&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_4_2.java (original)
+++ tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_4_2.java Mon Jun 8 20:53:39 2015
@@ -89,5 +89,31 @@ public class TestHttp2Section_4_2 extend
}
- // TODO Test connection vs stream error on a stream other than zero
+ @Test
+ public void testFrameTypeLimitsStream() throws Exception {
+ hpackEncoder = new HpackEncoder(ConnectionSettings.DEFAULT_HEADER_TABLE_SIZE);
+
+ // HTTP2 upgrade
+ http2Connect();
+
+ // Invalid priority
+ byte[] ping = new byte[9];
+
+ // Header
+ // Length 0
+ // Type
+ ping[3] = FrameType.PRIORITY.getIdByte();
+ // No flags
+ // Stream 3
+ ByteUtil.set31Bits(ping, 5, 3);
+ // Empty payload
+
+ os.write(ping);
+
+ // Read GOAWAY frame
+ parser.readFrame(true);
+
+ Assert.assertTrue(output.getTrace(),
+ output.getTrace().startsWith("3-RST-[6]"));
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org