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 19:06:40 UTC

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

Author: markt
Date: Tue Jun  2 17:06:40 2015
New Revision: 1683141

URL: http://svn.apache.org/r1683141
Log:
More tests for RFC7540 section 3.2.1
- Ensure HTTP2-Settings appears in the Connection header
- Support the connection header being split across multiple headers
- Refactor the tests to allow custom Connection headers to be injected

Modified:
    tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java
    tomcat/trunk/java/org/apache/coyote/http2/Http2Protocol.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/http11/Http11Processor.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java?rev=1683141&r1=1683140&r2=1683141&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java Tue Jun  2 17:06:40 2015
@@ -19,6 +19,7 @@ package org.apache.coyote.http11;
 import java.io.IOException;
 import java.io.InterruptedIOException;
 import java.nio.ByteBuffer;
+import java.util.Enumeration;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
@@ -1028,8 +1029,14 @@ public class Http11Processor extends Abs
             }
 
             // Has an upgrade been requested?
-            String connection = request.getHeader(Constants.CONNECTION);
-            if (connection != null && connection.toLowerCase().contains("upgrade")) {
+            Enumeration<String> connectionValues = request.getMimeHeaders().values("Connection");
+            boolean foundUpgrade = false;
+            while (connectionValues.hasMoreElements() && !foundUpgrade) {
+                foundUpgrade = connectionValues.nextElement().toLowerCase(
+                        Locale.ENGLISH).contains("upgrade");
+            }
+
+            if (foundUpgrade) {
                 // Check the protocol
                 String requestedProtocol = request.getHeader("Upgrade");
 

Modified: tomcat/trunk/java/org/apache/coyote/http2/Http2Protocol.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/Http2Protocol.java?rev=1683141&r1=1683140&r2=1683141&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/Http2Protocol.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/Http2Protocol.java Tue Jun  2 17:06:40 2015
@@ -81,17 +81,22 @@ public class Http2Protocol implements Up
     @Override
     public boolean accept(Request request) {
         // Should only be one HTTP2-Settings header
-        Enumeration<String> headers = request.getMimeHeaders().values("HTTP2-Settings");
+        Enumeration<String> settings = request.getMimeHeaders().values("HTTP2-Settings");
         int count = 0;
-        while (headers.hasMoreElements()) {
+        while (settings.hasMoreElements()) {
             count++;
-            headers.nextElement();
+            settings.nextElement();
         }
         if (count != 1) {
             return false;
         }
 
-        return true;
+        Enumeration<String> connection = request.getMimeHeaders().values("Connection");
+        boolean found = false;
+        while (connection.hasMoreElements() && !found) {
+            found = connection.nextElement().contains("HTTP2-Settings");
+        }
+        return found;
     }
 
 

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=1683141&r1=1683140&r2=1683141&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/coyote/http2/Http2TestBase.java (original)
+++ tomcat/trunk/test/org/apache/coyote/http2/Http2TestBase.java Tue Jun  2 17:06:40 2015
@@ -49,6 +49,7 @@ import org.apache.tomcat.util.codec.bina
  */
 public abstract class Http2TestBase extends TomcatBaseTest {
 
+    static final String DEFAULT_CONNECTION_HEADER_VALUE = "Upgrade, HTTP2-Settings";
     private static final byte[] EMPTY_SETTINGS_FRAME =
         { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00 };
     static final String EMPTY_HTTP2_SETTINGS_HEADER;
@@ -75,6 +76,10 @@ public abstract class Http2TestBase exte
         openClientConnection();
         doHttpUpgrade();
         sendClientPreface();
+        validateHttp2InitialResponse();
+    }
+
+    protected void validateHttp2InitialResponse() throws Exception {
         // - 101 response acts as acknowledgement of the HTTP2-Settings header
         // Need to read 4 frames
         // - settings (server settings - must be first)
@@ -134,14 +139,14 @@ public abstract class Http2TestBase exte
 
 
     protected void doHttpUpgrade() throws IOException {
-        doHttpUpgrade("h2c", EMPTY_HTTP2_SETTINGS_HEADER, true);
+        doHttpUpgrade(DEFAULT_CONNECTION_HEADER_VALUE, "h2c", EMPTY_HTTP2_SETTINGS_HEADER, true);
     }
 
-    protected void doHttpUpgrade(String upgrade, String settings, boolean validate)
-            throws IOException {
+    protected void doHttpUpgrade(String connection, 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" +
+                "Connection: "+ connection + "\r\n" +
                 "Upgrade: " + upgrade + "\r\n" +
                 settings +
                 "\r\n").getBytes(StandardCharsets.ISO_8859_1);
@@ -241,7 +246,7 @@ public abstract class Http2TestBase exte
     }
 
 
-    private void sendClientPreface() throws IOException {
+    void sendClientPreface() throws IOException {
         os.write(Http2Parser.CLIENT_PREFACE_START);
         os.write(EMPTY_SETTINGS_FRAME);
         os.flush();

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=1683141&r1=1683140&r2=1683141&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 17:06:40 2015
@@ -39,7 +39,7 @@ public class TestHttp2Section_3_2 extend
     public void testConnectionNoHttp2Support() throws Exception {
         configureAndStartWebApplication();
         openClientConnection();
-        doHttpUpgrade("h2c", EMPTY_HTTP2_SETTINGS_HEADER, false);
+        doHttpUpgrade(DEFAULT_CONNECTION_HEADER_VALUE, "h2c", EMPTY_HTTP2_SETTINGS_HEADER, false);
         parseHttp11Response();
     }
 
@@ -49,7 +49,7 @@ public class TestHttp2Section_3_2 extend
         enableHttp2();
         configureAndStartWebApplication();
         openClientConnection();
-        doHttpUpgrade("h2", EMPTY_HTTP2_SETTINGS_HEADER, false);
+        doHttpUpgrade(DEFAULT_CONNECTION_HEADER_VALUE, "h2", EMPTY_HTTP2_SETTINGS_HEADER, false);
         parseHttp11Response();
     }
 

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=1683141&r1=1683140&r2=1683141&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 17:06:40 2015
@@ -21,26 +21,61 @@ import org.junit.Test;
 public class TestHttp2Section_3_2_1 extends Http2TestBase {
 
     @Test
-    public void testZeroHttp2Settings() throws Exception{
+    public void testZeroHttp2Settings() throws Exception {
         enableHttp2();
         configureAndStartWebApplication();
         openClientConnection();
-        doHttpUpgrade("h2c", "", false);
+        doHttpUpgrade(Http2TestBase.DEFAULT_CONNECTION_HEADER_VALUE, "h2c", "", false);
         parseHttp11Response();
     }
 
 
     @Test
-    public void testMultipleHttp2Settings() throws Exception{
+    public void testMultipleHttp2Settings() throws Exception {
         enableHttp2();
         configureAndStartWebApplication();
         openClientConnection();
-        doHttpUpgrade("h2c", Http2TestBase.EMPTY_HTTP2_SETTINGS_HEADER +
+        doHttpUpgrade(Http2TestBase.DEFAULT_CONNECTION_HEADER_VALUE, "h2c",
+                Http2TestBase.EMPTY_HTTP2_SETTINGS_HEADER +
                 Http2TestBase.EMPTY_HTTP2_SETTINGS_HEADER, false);
         parseHttp11Response();
     }
 
 
+    @Test
+    public void testMissingConnectionValue() throws Exception {
+        enableHttp2();
+        configureAndStartWebApplication();
+        openClientConnection();
+        doHttpUpgrade("Upgrade", "h2c", Http2TestBase.EMPTY_HTTP2_SETTINGS_HEADER, false);
+        parseHttp11Response();
+    }
+
+
+    @Test
+    public void testSplitConnectionValue01() throws Exception {
+        enableHttp2();
+        configureAndStartWebApplication();
+        openClientConnection();
+        doHttpUpgrade("Upgrade\r\nConnection: HTTP2-Settings", "h2c",
+                Http2TestBase.EMPTY_HTTP2_SETTINGS_HEADER, true);
+        sendClientPreface();
+        validateHttp2InitialResponse();
+    }
+
+
+    @Test
+    public void testSplitConnectionValue02() throws Exception {
+        enableHttp2();
+        configureAndStartWebApplication();
+        openClientConnection();
+        doHttpUpgrade("HTTP2-Settings\r\nConnection: Upgrade", "h2c",
+                Http2TestBase.EMPTY_HTTP2_SETTINGS_HEADER, true);
+        sendClientPreface();
+        validateHttp2InitialResponse();
+    }
+
+
     // TODO: Test trailing '=' are omitted
 
     // TODO: Test invalid Http2-Settings header (wrong length, invalid encoding)



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