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