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 2019/04/07 17:23:08 UTC

[tomcat] branch master updated: Fix missing query string on protocol upgrade

This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/master by this push:
     new f4681e6  Fix missing query string on protocol upgrade
f4681e6 is described below

commit f4681e638990f54eefc92a06c63e7431a9badaeb
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Sun Apr 7 18:22:23 2019 +0100

    Fix missing query string on protocol upgrade
---
 java/org/apache/coyote/http11/Http11Processor.java |  1 +
 .../apache/coyote/http2/TestStreamQueryString.java | 52 ++++++++++++++++++++--
 webapps/docs/changelog.xml                         |  5 +++
 3 files changed, 55 insertions(+), 3 deletions(-)

diff --git a/java/org/apache/coyote/http11/Http11Processor.java b/java/org/apache/coyote/http11/Http11Processor.java
index c5f198c..e272a92 100644
--- a/java/org/apache/coyote/http11/Http11Processor.java
+++ b/java/org/apache/coyote/http11/Http11Processor.java
@@ -513,6 +513,7 @@ public class Http11Processor extends AbstractProcessor {
         dest.method().duplicate(source.method());
         dest.getMimeHeaders().duplicate(source.getMimeHeaders());
         dest.requestURI().duplicate(source.requestURI());
+        dest.queryString().duplicate(source.queryString());
 
         return dest;
 
diff --git a/test/org/apache/coyote/http2/TestStreamQueryString.java b/test/org/apache/coyote/http2/TestStreamQueryString.java
index f92540c..b1749e9 100644
--- a/test/org/apache/coyote/http2/TestStreamQueryString.java
+++ b/test/org/apache/coyote/http2/TestStreamQueryString.java
@@ -20,6 +20,7 @@ import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.net.URLDecoder;
 import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -73,15 +74,13 @@ public class TestStreamQueryString extends Http2TestBase {
         Tomcat tomcat = getTomcatInstance();
 
         Context ctxt = tomcat.addContext("", null);
-        Tomcat.addServlet(ctxt, "simple", new SimpleServlet());
-        ctxt.addServletMappingDecoded("/simple", "simple");
         Tomcat.addServlet(ctxt, "query", new Query(queryValue));
         ctxt.addServletMappingDecoded("/query", "query");
 
         tomcat.start();
 
         openClientConnection();
-        doHttpUpgrade();
+        doHttpUpgrade(queryValue);
         sendClientPreface();
         validateHttp2InitialResponse();
 
@@ -105,6 +104,53 @@ public class TestStreamQueryString extends Http2TestBase {
     }
 
 
+    protected void doHttpUpgrade(String queryValue) throws IOException {
+        byte[] upgradeRequest = ("GET /query?" + Query.PARAM_NAME + "=" + queryValue + " HTTP/1.1\r\n" +
+                "Host: localhost:" + getPort() + "\r\n" +
+                "Connection: "+ DEFAULT_CONNECTION_HEADER_VALUE + "\r\n" +
+                "Upgrade: h2c\r\n" +
+                EMPTY_HTTP2_SETTINGS_HEADER +
+                "\r\n").getBytes(StandardCharsets.ISO_8859_1);
+        os.write(upgradeRequest);
+        os.flush();
+
+        Assert.assertTrue("Failed to read HTTP Upgrade response",
+                readHttpUpgradeResponse());
+    }
+
+
+    @Override
+    protected void validateHttp2InitialResponse() throws Exception {
+        // - 101 response acts as acknowledgement of the HTTP2-Settings header
+        // Need to read 5 frames
+        // - settings (server settings - must be first)
+        // - settings ack (for the settings frame in the client preface)
+        // - ping
+        // - headers (for response)
+        // - data (for response body)
+        parser.readFrame(true);
+        parser.readFrame(true);
+        parser.readFrame(true);
+        parser.readFrame(true);
+        parser.readFrame(true);
+
+        Assert.assertEquals("0-Settings-[3]-[200]\n" +
+                "0-Settings-End\n" +
+                "0-Settings-Ack\n" +
+                "0-Ping-[0,0,0,0,0,0,0,1]\n" +
+                "1-HeadersStart\n" +
+                "1-Header-[:status]-[200]\n" +
+                "1-Header-[content-type]-[text/plain;charset=UTF-8]\n" +
+                "1-Header-[content-length]-[2]\n" +
+                "1-Header-[date]-[Wed, 11 Nov 2015 19:18:42 GMT]\n" +
+                "1-HeadersEnd\n" +
+                "1-Body-2\n" +
+                "1-EndOfStream\n", output.getTrace());
+
+        output.clearTrace();
+    }
+
+
     private static final class Query extends HttpServlet {
 
         private static final long serialVersionUID = 1L;
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index a327e90..7a7601c 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -127,6 +127,11 @@
       <fix>
         Fix NIO2 SSL edge cases. (remm)
       </fix>
+      <fix>
+        When performing an upgrade from HTTP/1.1 to HTTP/2, ensure that any
+        query string present in the original HTTP/1.1 request is passed to the
+        HTTP/2 request processing. (markt)
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Jasper">


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