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