Author: markt Date: Thu Jun 4 13:31:14 2015 New Revision: 1683546 URL: http://svn.apache.org/r1683546 Log: Add unit tests to check headers and any associated continuation frames are contiguous.
Modified: tomcat/trunk/test/org/apache/coyote/http2/Http2TestBase.java tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_4_1.java tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_4_3.java 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=1683546&r1=1683545&r2=1683546&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/coyote/http2/Http2TestBase.java (original) +++ tomcat/trunk/test/org/apache/coyote/http2/Http2TestBase.java Thu Jun 4 13:31:14 2015 @@ -111,7 +111,7 @@ public abstract class Http2TestBase exte ByteBuffer headersPayload = ByteBuffer.allocate(128); buildSimpleRequest(frameHeader, headersPayload, streamId); - writeSimpleRequest(frameHeader, headersPayload); + writeFrame(frameHeader, headersPayload); } @@ -134,10 +134,47 @@ public abstract class Http2TestBase exte } - protected void writeSimpleRequest(byte[] frameHeader, ByteBuffer headersPayload) + protected void buildSimpleRequestPart1(byte[] frameHeader, ByteBuffer headersPayload, + int streamId) { + MimeHeaders headers = new MimeHeaders(); + headers.addValue(":method").setString("GET"); + headers.addValue(":path").setString("/any"); + hpackEncoder.encode(headers, headersPayload); + + headersPayload.flip(); + + ByteUtil.setThreeBytes(frameHeader, 0, headersPayload.limit()); + // Header frame is type 0x01 + frameHeader[3] = 0x01; + // Flags. end of stream (0x01) + frameHeader[4] = 0x01; + // Stream id + ByteUtil.set31Bits(frameHeader, 5, streamId); + } + + + protected void buildSimpleRequestPart2(byte[] frameHeader, ByteBuffer headersPayload, + int streamId) { + MimeHeaders headers = new MimeHeaders(); + headers.addValue(":authority").setString("localhost:" + getPort()); + hpackEncoder.encode(headers, headersPayload); + + headersPayload.flip(); + + ByteUtil.setThreeBytes(frameHeader, 0, headersPayload.limit()); + // Continuation frame is type 0x09 + frameHeader[3] = 0x09; + // Flags. end of headers (0x04) + frameHeader[4] = 0x04; + // Stream id + ByteUtil.set31Bits(frameHeader, 5, streamId); + } + + + protected void writeFrame(byte[] header, ByteBuffer payload) throws IOException { - os.write(frameHeader); - os.write(headersPayload.array(), headersPayload.arrayOffset(), headersPayload.limit()); + os.write(header); + os.write(payload.array(), payload.arrayOffset(), payload.limit()); os.flush(); } Modified: tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_4_1.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_4_1.java?rev=1683546&r1=1683545&r2=1683546&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_4_1.java (original) +++ tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_4_1.java Thu Jun 4 13:31:14 2015 @@ -68,7 +68,7 @@ public class TestHttp2Section_4_1 extend frameHeader[5] = (byte) (frameHeader[5] | 0x80); // Process the request - writeSimpleRequest(frameHeader, headersPayload); + writeFrame(frameHeader, headersPayload); readSimpleResponse(); Assert.assertEquals(getSimpleResponseTrace(3), output.getTrace()); Modified: tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_4_3.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_4_3.java?rev=1683546&r1=1683545&r2=1683546&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_4_3.java (original) +++ tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_4_3.java Thu Jun 4 13:31:14 2015 @@ -46,7 +46,7 @@ public class TestHttp2Section_4_3 extend headersPayload.put(0, (byte) (headersPayload.get(0) + 128)); // Process the request - writeSimpleRequest(frameHeader, headersPayload); + writeFrame(frameHeader, headersPayload); // Read GOAWAY frame parser.readFrame(true); @@ -57,5 +57,57 @@ public class TestHttp2Section_4_3 extend } - // TODO: Header frames must be a contiguous sequence + @Test + public void testHeaderContinuationContiguous() throws Exception { + hpackEncoder = new HpackEncoder(ConnectionSettings.DEFAULT_HEADER_TABLE_SIZE); + + // HTTP2 upgrade + http2Connect(); + + // Part 1 + byte[] frameHeader = new byte[9]; + ByteBuffer headersPayload = ByteBuffer.allocate(128); + buildSimpleRequestPart1(frameHeader, headersPayload, 3); + writeFrame(frameHeader, headersPayload); + + // Part 2 + headersPayload.clear(); + buildSimpleRequestPart2(frameHeader, headersPayload, 3); + writeFrame(frameHeader, headersPayload); + + // headers, body + parser.readFrame(true); + parser.readFrame(true); + + Assert.assertEquals(getSimpleResponseTrace(3), output.getTrace()); + } + + + @Test + public void testHeaderContinuationNonContiguous() throws Exception { + hpackEncoder = new HpackEncoder(ConnectionSettings.DEFAULT_HEADER_TABLE_SIZE); + + // HTTP2 upgrade + http2Connect(); + + // Part 1 + byte[] frameHeader = new byte[9]; + ByteBuffer headersPayload = ByteBuffer.allocate(128); + buildSimpleRequestPart1(frameHeader, headersPayload, 3); + writeFrame(frameHeader, headersPayload); + + sendPing(); + + // Part 2 + headersPayload.clear(); + buildSimpleRequestPart2(frameHeader, headersPayload, 3); + writeFrame(frameHeader, headersPayload); + + // Read GOAWAY frame + parser.readFrame(true); + + Assert.assertTrue(output.getTrace(), + output.getTrace().startsWith("0-Goaway-[2147483647]-[" + + ErrorCode.COMPRESSION_ERROR.getErrorCode() + "]-[")); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org