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