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 2013/05/28 13:32:01 UTC

svn commit: r1486877 - in /tomcat/tc7.0.x/trunk: ./ java/org/apache/coyote/http11/InternalNioInputBuffer.java test/org/apache/catalina/startup/SimpleHttpClient.java test/org/apache/coyote/http11/TestInternalInputBuffer.java webapps/docs/changelog.xml

Author: markt
Date: Tue May 28 11:32:00 2013
New Revision: 1486877

URL: http://svn.apache.org/r1486877
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=54947
NIO connector incorrectly rejects a request if the CRLF terminating the request line is split across multiple packets.
Patch for the fix by Konstantin Preißer.
I added a test case.

Modified:
    tomcat/tc7.0.x/trunk/   (props changed)
    tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/InternalNioInputBuffer.java
    tomcat/tc7.0.x/trunk/test/org/apache/catalina/startup/SimpleHttpClient.java
    tomcat/tc7.0.x/trunk/test/org/apache/coyote/http11/TestInternalInputBuffer.java
    tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml

Propchange: tomcat/tc7.0.x/trunk/
------------------------------------------------------------------------------
  Merged /tomcat/trunk:r1486875

Modified: tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/InternalNioInputBuffer.java
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/InternalNioInputBuffer.java?rev=1486877&r1=1486876&r2=1486877&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/InternalNioInputBuffer.java (original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/InternalNioInputBuffer.java Tue May 28 11:32:00 2013
@@ -339,11 +339,11 @@ public class InternalNioInputBuffer exte
             }
             parsingRequestLineStart = pos;
             parsingRequestLinePhase = 6;
-        }
-        if (parsingRequestLinePhase == 6) { 
+
             // Mark the current buffer position
-            
             end = 0;
+        }
+        if (parsingRequestLinePhase == 6) { 
             //
             // Reading the protocol
             // Protocol is always US-ASCII

Modified: tomcat/tc7.0.x/trunk/test/org/apache/catalina/startup/SimpleHttpClient.java
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/test/org/apache/catalina/startup/SimpleHttpClient.java?rev=1486877&r1=1486876&r2=1486877&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/test/org/apache/catalina/startup/SimpleHttpClient.java (original)
+++ tomcat/tc7.0.x/trunk/test/org/apache/catalina/startup/SimpleHttpClient.java Tue May 28 11:32:00 2013
@@ -42,7 +42,9 @@ public abstract class SimpleHttpClient {
     public static final String TEMP_DIR =
             System.getProperty("java.io.tmpdir");
 
-    public static final String CRLF = "\r\n";
+    public static final String CR = "\r";
+    public static final String LF = "\n";
+    public static final String CRLF = CR + LF;
 
     public static final String INFO_100 = "HTTP/1.1 100";
     public static final String OK_200 = "HTTP/1.1 200";

Modified: tomcat/tc7.0.x/trunk/test/org/apache/coyote/http11/TestInternalInputBuffer.java
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/test/org/apache/coyote/http11/TestInternalInputBuffer.java?rev=1486877&r1=1486876&r2=1486877&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/test/org/apache/coyote/http11/TestInternalInputBuffer.java (original)
+++ tomcat/tc7.0.x/trunk/test/org/apache/coyote/http11/TestInternalInputBuffer.java Tue May 28 11:32:00 2013
@@ -415,4 +415,67 @@ public class TestInternalInputBuffer ext
     }
 
 
+    /**
+     * Test case for https://issues.apache.org/bugzilla/show_bug.cgi?id=54947
+     */
+    @Test
+    public void testBug54947() {
+
+        Bug54947Client client = new Bug54947Client();
+
+        client.doRequest();
+        assertTrue(client.isResponse200());
+        assertTrue(client.isResponseBodyOK());
+    }
+
+
+    /**
+     * Bug 54947 test client.
+     */
+    private class Bug54947Client extends SimpleHttpClient {
+
+        private Exception doRequest() {
+
+            Tomcat tomcat = getTomcatInstance();
+
+            Context root = tomcat.addContext("", TEMP_DIR);
+            Tomcat.addServlet(root, "Bug54947", new TesterServlet());
+            root.addServletMapping("/test", "Bug54947");
+
+            try {
+                tomcat.start();
+                setPort(tomcat.getConnector().getLocalPort());
+
+                // Open connection
+                connect();
+
+                String[] request = new String[2];
+                request[0] = "GET http://localhost:8080/test HTTP/1.1" + CR;
+                request[1] = LF +
+                        "Connection: close" + CRLF +
+                        CRLF;
+
+                setRequest(request);
+                processRequest(); // blocks until response has been read
+
+                // Close the connection
+                disconnect();
+            } catch (Exception e) {
+                return e;
+            }
+            return null;
+        }
+
+        @Override
+        public boolean isResponseBodyOK() {
+            if (getResponseBody() == null) {
+                return false;
+            }
+            if (!getResponseBody().contains("OK")) {
+                return false;
+            }
+            return true;
+        }
+
+    }
 }

Modified: tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml?rev=1486877&r1=1486876&r2=1486877&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml Tue May 28 11:32:00 2013
@@ -109,6 +109,15 @@
       </fix>
     </changelog>
   </subsection>
+  <subsection name="Coyote">
+    <changelog>
+      <fix>
+        <bug>54947</bug>: Fix the HTTP NIO connector that incorrectly rejected a
+        request if the CRLF terminating the request line was split across
+        multiple packets. Patch by Konstantin Preißer. (markt)
+      </fix>
+    </changelog>
+  </subsection>
   <subsection name="Jasper">
     <changelog>
       <fix>



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