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/04 15:31:15 UTC

svn commit: r1683546 - in /tomcat/trunk/test/org/apache/coyote/http2: Http2TestBase.java TestHttp2Section_4_1.java TestHttp2Section_4_3.java

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-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org