Author: markt Date: Tue Jun 23 19:28:15 2015 New Revision: 1687119 URL: http://svn.apache.org/r1687119 Log: Add some more header frame + padding tests Fix a bug in the parser (it didn't catch padding >= payload)
Modified: tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_6_2.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=1687119&r1=1687118&r2=1687119&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java (original) +++ tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java Tue Jun 23 19:28:15 2015 @@ -144,7 +144,7 @@ class Http2Parser { if (padLength >= payloadSize) { throw new ConnectionException( - sm.getString("http2Parser.processFrameData.tooMuchPadding", connectionId, + sm.getString("http2Parser.processFrame.tooMuchPadding", connectionId, Integer.toString(streamId), Integer.toString(padLength), Integer.toString(payloadSize)), Http2Error.PROTOCOL_ERROR); } @@ -216,6 +216,12 @@ class Http2Parser { int optionalPos = 0; if (padding) { padLength = ByteUtil.getOneByte(optional, optionalPos++); + if (padLength >= payloadSize) { + throw new ConnectionException( + sm.getString("http2Parser.processFrame.tooMuchPadding", connectionId, + Integer.toString(streamId), Integer.toString(padLength), + Integer.toString(payloadSize)), Http2Error.PROTOCOL_ERROR); + } } if (priority) { boolean exclusive = ByteUtil.isBit7Set(optional[optionalPos]); 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=1687119&r1=1687118&r2=1687119&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties (original) +++ tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties Tue Jun 23 19:28:15 2015 @@ -43,10 +43,10 @@ http2Parser.payloadTooBig=The payload is http2Parser.preface.invalid=Invalid connection preface [{0}] presented http2Parser.preface.io=Unable to read connection preface http2Parser.processFrame=Connection [{0}], Stream [{1}], Frame type [{2}], Flags [{3}], Payload size [{4}] +http2Parser.processFrame.tooMuchPadding=Connection [{0}], Stream [{1}], The padding length [{2}] was too big for the payload [{3}] http2Parser.processFrame.unexpectedType=Expected frame type [{0}] but received frame type [{1}] http2Parser.processFrameContinuation.notExpected=Connection [{0}], Continuation frame received for stream [{1}] when no headers were in progress http2Parser.processFrameData.lengths=Connection [{0}], Stream [{1}], Data length, [{2}], Padding length [{3}] -http2Parser.processFrameData.tooMuchPadding=Connection [{0}], Stream [{1}], The padding length [{2}] was too big for the payload [{3}] http2Parser.processFrameGoaway.payloadTooSmall=Connection [{0}]: Goaway payload size was [{1}] which is less than the minimum 8 http2Parser.processFrameHeaders.decodingFailed=There was an error during the HPACK decoding of HTTP headers http2Parser.processFrameHeaders.decodingDataLeft=Data left over after HPACK decoding - it should have been consumed Modified: tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_6_2.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_6_2.java?rev=1687119&r1=1687118&r2=1687119&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_6_2.java (original) +++ tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_6_2.java Tue Jun 23 19:28:15 2015 @@ -58,12 +58,62 @@ public class TestHttp2Section_6_2 extend sendSimpleGetRequest(3, padding); readSimpleGetResponse(); Assert.assertEquals(getSimpleResponseTrace(3), output.getTrace()); - output.clearTrace(); } - // with non-zero padding - // too much padding + @Test + public void testHeaderFrameWithNonZeroPadding() throws Exception { + http2Connect(); - // zero length padding + byte[] padding= new byte[8]; + padding[4] = 1; + + sendSimpleGetRequest(3, padding); + + // Goaway + parser.readFrame(true); + + Assert.assertTrue(output.getTrace(), output.getTrace().startsWith( + "0-Goaway-[1]-[" + Http2Error.PROTOCOL_ERROR.getCode() + "]-[")); + } + + + @Test + public void testHeaderFrameTooMuchPadding() throws Exception { + http2Connect(); + + byte[] headerFrame = new byte[10]; + + // Header + // length + ByteUtil.setThreeBytes(headerFrame, 0, 1); + // type 1 (headers) + headerFrame[3] = 0x01; + // flags 8 (padded) + headerFrame[4] = 0x08; + // stream 3 + ByteUtil.set31Bits(headerFrame, 5, 3); + // payload (pad length of 1) + headerFrame[9] = 1; + + os.write(headerFrame); + os.flush(); + + parser.readFrame(true); + + String trace = output.getTrace(); + Assert.assertTrue(trace, trace.startsWith("0-Goaway-[1]-[1]-[")); + } + + + @Test + public void testHeaderFrameWithZeroLengthPadding() throws Exception { + http2Connect(); + + byte[] padding= new byte[0]; + + sendSimpleGetRequest(3, padding); + readSimpleGetResponse(); + Assert.assertEquals(getSimpleResponseTrace(3), output.getTrace()); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org