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/02 14:39:40 UTC

svn commit: r1683085 - in /tomcat/trunk: java/org/apache/coyote/http2/ test/org/apache/coyote/http2/

Author: markt
Date: Tue Jun  2 12:39:39 2015
New Revision: 1683085

URL: http://svn.apache.org/r1683085
Log:
Expand testing of section 3.2.1
 - Refactor Http2Parser.Output for empty settings to enable explicit testing
   for empty settings frames from the server
 - Refactor tests to reduce code required for 'standard' values and to expand
   options for adding non-standard values
 - Add a test for zero HTTP2-Settings headers
 

Modified:
    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/Http2TestBase.java
    tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_3_2.java
    tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_3_2_1.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=1683085&r1=1683084&r2=1683085&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java Tue Jun  2 12:39:39 2015
@@ -289,9 +289,7 @@ class Http2Parser {
 
         if (payloadSize == 0) {
             // Either an ACK or an empty settings frame
-            if ((flags & 0x1) != 0) {
-                output.settingsAck();
-            }
+            output.settingsEmpty((flags & 0x1) != 0);
         } else {
             // Process the settings
             byte[] setting = new byte[6];
@@ -482,7 +480,7 @@ class Http2Parser {
         void headersEnd(int streamId);
 
         // Settings frames
-        void settingsAck();
+        void settingsEmpty(boolean ack);
         void setting(int identifier, long value) throws IOException;
 
         // Ping frames

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=1683085&r1=1683084&r2=1683085&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java Tue Jun  2 12:39:39 2015
@@ -751,8 +751,10 @@ public class Http2UpgradeHandler extends
 
 
     @Override
-    public void settingsAck() {
-        // TODO Auto-generated method stub
+    public void settingsEmpty(boolean ack) {
+        if (ack) {
+            // TODO Process ACK
+        }
     }
 
 

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=1683085&r1=1683084&r2=1683085&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/coyote/http2/Http2TestBase.java (original)
+++ tomcat/trunk/test/org/apache/coyote/http2/Http2TestBase.java Tue Jun  2 12:39:39 2015
@@ -22,6 +22,7 @@ import java.io.OutputStream;
 import java.net.Socket;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
+import java.util.Locale;
 
 import javax.net.SocketFactory;
 import javax.servlet.ServletException;
@@ -48,11 +49,11 @@ import org.apache.tomcat.util.codec.bina
  */
 public abstract class Http2TestBase extends TomcatBaseTest {
 
-    private static final String HTTP2_SETTINGS;
+    static final String EMPTY_HTTP2_SETTINGS;
 
     static {
         byte[] empty = new byte[0];
-        HTTP2_SETTINGS = Base64.encodeBase64String(empty);
+        EMPTY_HTTP2_SETTINGS = "HTTP2-Settings: " + Base64.encodeBase64String(empty) + "\r\n";
     }
 
     private Socket s;
@@ -70,14 +71,15 @@ public abstract class Http2TestBase exte
         enableHttp2();
         configureAndStartWebApplication();
         openClientConnection();
-        doHttpUpgrade("h2c", true);
+        doHttpUpgrade();
         sendClientPreface();
         // Need to read 3 frames (settings, headers and response body)
         parser.readFrame(true);
         parser.readFrame(true);
         parser.readFrame(true);
 
-        Assert.assertEquals("1-HeadersStart\n" +
+        Assert.assertEquals("0-Settings-Empty\n" +
+                "1-HeadersStart\n" +
                 "1-Header-[:status]-[200]\n" +
                 "1-HeadersEnd\n" +
                 "1-Body-8192\n" +
@@ -122,12 +124,17 @@ public abstract class Http2TestBase exte
     }
 
 
-    protected void doHttpUpgrade(String upgrade, boolean validate) throws IOException {
+    protected void doHttpUpgrade() throws IOException {
+        doHttpUpgrade("h2c", EMPTY_HTTP2_SETTINGS, true);
+    }
+
+    protected void doHttpUpgrade(String upgrade, String settings, boolean validate)
+            throws IOException {
         byte[] upgradeRequest = ("GET / HTTP/1.1\r\n" +
                 "Host: localhost:" + getPort() + "\r\n" +
                 "Connection: Upgrade, HTTP2-Settings\r\n" +
                 "Upgrade: " + upgrade + "\r\n" +
-                "HTTP2-Settings: "+ HTTP2_SETTINGS + "\r\n" +
+                settings +
                 "\r\n").getBytes(StandardCharsets.ISO_8859_1);
         os.write(upgradeRequest);
         os.flush();
@@ -203,6 +210,28 @@ public abstract class Http2TestBase exte
     }
 
 
+    void parseHttp11Response() throws IOException {
+        String[] responseHeaders = readHttpResponseHeaders();
+        Assert.assertTrue(responseHeaders[0], responseHeaders[0].startsWith("HTTP/1.1 200"));
+
+        // Find the content length (chunked responses not handled)
+        for (int i = 1; i < responseHeaders.length; i++) {
+            if (responseHeaders[i].toLowerCase(Locale.ENGLISH).startsWith("content-length")) {
+                String cl = responseHeaders[i];
+                int pos = cl.indexOf(':');
+                if (pos == -1) {
+                    throw new IOException("Invalid: [" + cl + "]");
+                }
+                int len = Integer.parseInt(cl.substring(pos + 1).trim());
+                byte[] content = new byte[len];
+                input.fill(true, content);
+                return;
+            }
+        }
+        Assert.fail("No content-length in response");
+    }
+
+
     private void sendClientPreface() throws IOException {
         os.write(Http2Parser.CLIENT_PREFACE_START);
         os.flush();
@@ -293,11 +322,15 @@ public abstract class Http2TestBase exte
 
 
         @Override
-        public void settingsAck() {
-            trace.append("0-Settings-Ack\n");
-
+        public void settingsEmpty(boolean ack) {
+            if (ack) {
+                trace.append("0-Settings-Ack\n");
+            } else {
+                trace.append("0-Settings-Empty\n");
+            }
         }
 
+
         @Override
         public void setting(int identifier, long value) throws IOException {
             trace.append("0-Settings-[" + identifier + "]-[" + value + "]\n");

Modified: tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_3_2.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_3_2.java?rev=1683085&r1=1683084&r2=1683085&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_3_2.java (original)
+++ tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_3_2.java Tue Jun  2 12:39:39 2015
@@ -18,9 +18,7 @@ package org.apache.coyote.http2;
 
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
-import java.util.Locale;
 
-import org.junit.Assert;
 import org.junit.Test;
 
 /**
@@ -41,7 +39,7 @@ public class TestHttp2Section_3_2 extend
     public void testConnectionNoHttp2Support() throws Exception {
         configureAndStartWebApplication();
         openClientConnection();
-        doHttpUpgrade("h2c", false);
+        doHttpUpgrade("h2c", EMPTY_HTTP2_SETTINGS, false);
         parseHttp11Response();
     }
 
@@ -51,7 +49,7 @@ public class TestHttp2Section_3_2 extend
         enableHttp2();
         configureAndStartWebApplication();
         openClientConnection();
-        doHttpUpgrade("h2", false);
+        doHttpUpgrade("h2", EMPTY_HTTP2_SETTINGS, false);
         parseHttp11Response();
     }
 
@@ -115,28 +113,6 @@ public class TestHttp2Section_3_2 extend
         enableHttp2();
         configureAndStartWebApplication();
         openClientConnection();
-        doHttpUpgrade("h2c", true);
-    }
-
-
-    private void parseHttp11Response() throws IOException {
-        String[] responseHeaders = readHttpResponseHeaders();
-        Assert.assertTrue(responseHeaders[0], responseHeaders[0].startsWith("HTTP/1.1 200"));
-
-        // Find the content length (chunked responses not handled)
-        for (int i = 1; i < responseHeaders.length; i++) {
-            if (responseHeaders[i].toLowerCase(Locale.ENGLISH).startsWith("content-length")) {
-                String cl = responseHeaders[i];
-                int pos = cl.indexOf(':');
-                if (pos == -1) {
-                    throw new IOException("Invalid: [" + cl + "]");
-                }
-                int len = Integer.parseInt(cl.substring(pos + 1).trim());
-                byte[] content = new byte[len];
-                input.fill(true, content);
-                return;
-            }
-        }
-        Assert.fail("No content-length in response");
+        doHttpUpgrade();
     }
 }

Modified: tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_3_2_1.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_3_2_1.java?rev=1683085&r1=1683084&r2=1683085&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_3_2_1.java (original)
+++ tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_3_2_1.java Tue Jun  2 12:39:39 2015
@@ -16,8 +16,20 @@
  */
 package org.apache.coyote.http2;
 
+import org.junit.Test;
+
 public class TestHttp2Section_3_2_1 extends Http2TestBase {
 
+    @Test
+    public void testZeroHttp2Settings() throws Exception{
+        enableHttp2();
+        configureAndStartWebApplication();
+        openClientConnection();
+        doHttpUpgrade("h2", "", false);
+        parseHttp11Response();
+    }
+
+
     // TODO: Test zero Http2-Settings headers
 
     // TODO: Test multiple Http2-Settings headers



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org