Author: markt
Date: Thu Aug 30 13:12:13 2012
New Revision: 1378921

URL: http://svn.apache.org/viewvc?rev=1378921&view=rev
Log:
More chunked encoding improvements
- Expand unit tests for chunked encoding
- Fix a parsing error at eol when multiple headers are present (regression in 
r1378702)
- Make parsing of terminating CRLF non-tolerant (RFC2616 only suggests to be 
tolerant of LF at the end of headers)
- Revert previous unnecessary change to SimpleHttpClient

Modified:
    tomcat/tc7.0.x/trunk/   (props changed)
    
tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/filters/ChunkedInputFilter.java
    tomcat/tc7.0.x/trunk/test/org/apache/catalina/startup/SimpleHttpClient.java
    
tomcat/tc7.0.x/trunk/test/org/apache/coyote/http11/filters/TestChunkedInputFilter.java

Propchange: tomcat/tc7.0.x/trunk/
------------------------------------------------------------------------------
  Merged /tomcat/trunk:r1378868,1378918

Modified: 
tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/filters/ChunkedInputFilter.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/filters/ChunkedInputFilter.java?rev=1378921&r1=1378920&r2=1378921&view=diff
==============================================================================
--- 
tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/filters/ChunkedInputFilter.java
 (original)
+++ 
tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/filters/ChunkedInputFilter.java
 Thu Aug 30 13:12:13 2012
@@ -350,7 +350,8 @@ public class ChunkedInputFilter implemen
      */
     @Deprecated
     protected boolean parseCRLF() throws IOException {
-        return parseCRLF(false);
+        parseCRLF(false);
+        return true;
     }
 
     /**
@@ -360,7 +361,7 @@ public class ChunkedInputFilter implemen
      *                      is recommended (RFC2616, section 19.3) for message
      *                      headers.
      */
-    protected boolean parseCRLF(boolean tolerant) throws IOException {
+    protected void parseCRLF(boolean tolerant) throws IOException {
 
         boolean eol = false;
         boolean crfound = false;
@@ -387,9 +388,6 @@ public class ChunkedInputFilter implemen
             pos++;
 
         }
-
-        return true;
-
     }
 
 
@@ -421,7 +419,7 @@ public class ChunkedInputFilter implemen
     
         // CRLF terminates the request
         if (chr == Constants.CR || chr == Constants.LF) {
-            parseCRLF(true);
+            parseCRLF(false);
             return false;
         }
     
@@ -512,8 +510,9 @@ public class ChunkedInputFilter implemen
                     lastSignificantChar = trailingHeaders.getEnd();
                 }
     
-                pos++;
-    
+                if (!eol) {
+                    pos++;
+                }
             }
     
             // Checking the first character of the new line. If the character

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=1378921&r1=1378920&r2=1378921&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 
Thu Aug 30 13:12:13 2012
@@ -201,13 +201,7 @@ public abstract class SimpleHttpClient {
                 line = readLine();
                 while (line != null) {
                     builder.append(line);
-                    try {
-                        line = readLine();
-                    } catch (IOException ioe) {
-                        // The server probably closed the connection due to an
-                        // error
-                        line = null;
-                    }
+                    line = readLine();
                 }
             }
         }

Modified: 
tomcat/tc7.0.x/trunk/test/org/apache/coyote/http11/filters/TestChunkedInputFilter.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/test/org/apache/coyote/http11/filters/TestChunkedInputFilter.java?rev=1378921&r1=1378920&r2=1378921&view=diff
==============================================================================
--- 
tomcat/tc7.0.x/trunk/test/org/apache/coyote/http11/filters/TestChunkedInputFilter.java
 (original)
+++ 
tomcat/tc7.0.x/trunk/test/org/apache/coyote/http11/filters/TestChunkedInputFilter.java
 Thu Aug 30 13:12:13 2012
@@ -42,47 +42,58 @@ public class TestChunkedInputFilter exte
 
     @Test
     public void testChunkHeaderCRLF() throws Exception {
-        doTestChunkingCRLF(true, true, true, true, true);
+        doTestChunkingCRLF(true, true, true, true, true, true);
     }
 
     @Test
     public void testChunkHeaderLF() throws Exception {
-        doTestChunkingCRLF(false, true, true, true, false);
+        doTestChunkingCRLF(false, true, true, true, true, false);
     }
 
     @Test
     public void testChunkCRLF() throws Exception {
-        doTestChunkingCRLF(true, true, true, true, true);
+        doTestChunkingCRLF(true, true, true, true, true, true);
     }
 
     @Test
     public void testChunkLF() throws Exception {
-        doTestChunkingCRLF(true, false, true, true, false);
+        doTestChunkingCRLF(true, false, true, true, true, false);
     }
 
     @Test
-    public void testTrailingHeadersCRLF() throws Exception {
-        doTestChunkingCRLF(true, true, true, true, true);
+    public void testFirstTrailingHeadersCRLF() throws Exception {
+        doTestChunkingCRLF(true, true, true, true, true, true);
     }
 
     @Test
-    public void testTrailingHeadersLF() throws Exception {
-        doTestChunkingCRLF(true, true, false, true, true);
+    public void testFirstTrailingHeadersLF() throws Exception {
+        doTestChunkingCRLF(true, true, false, true, true, true);
+    }
+
+    @Test
+    public void testSecondTrailingHeadersCRLF() throws Exception {
+        doTestChunkingCRLF(true, true, true, true, true, true);
+    }
+
+    @Test
+    public void testSecondTrailingHeadersLF() throws Exception {
+        doTestChunkingCRLF(true, true, true, false, true, true);
     }
 
     @Test
     public void testEndCRLF() throws Exception {
-        doTestChunkingCRLF(true, true, true, true, true);
+        doTestChunkingCRLF(true, true, true, true, true, true);
     }
 
     @Test
     public void testEndLF() throws Exception {
-        doTestChunkingCRLF(true, true, true, false, false);
+        doTestChunkingCRLF(true, true, true, true, false, false);
     }
 
     private void doTestChunkingCRLF(boolean chunkHeaderUsesCRLF,
-            boolean chunkUsesCRLF, boolean headerUsesCRLF,
-            boolean endUsesCRLF, boolean expectPass) throws Exception {
+            boolean chunkUsesCRLF, boolean firstheaderUsesCRLF,
+            boolean secondheaderUsesCRLF, boolean endUsesCRLF,
+            boolean expectPass) throws Exception {
 
         // Setup Tomcat instance
         Tomcat tomcat = getTomcatInstance();
@@ -109,8 +120,10 @@ public class TestChunkedInputFilter exte
             "4" + SimpleHttpClient.CRLF +
             "&b=1" + SimpleHttpClient.CRLF +
             "0" + SimpleHttpClient.CRLF +
-            "x-trailer: Test", 
"TestTest0123456789abcdefghijABCDEFGHIJopqrstuvwxyz" +
-            (headerUsesCRLF ? SimpleHttpClient.CRLF : LF)+
+            "x-trailer1: Test", "Value1" +
+            (firstheaderUsesCRLF ? SimpleHttpClient.CRLF : LF) +
+            "x-trailer2: TestValue2" +
+            (secondheaderUsesCRLF ? SimpleHttpClient.CRLF : LF) +
             (endUsesCRLF ? SimpleHttpClient.CRLF : LF) };
 
         TrailerClient client =
@@ -122,7 +135,8 @@ public class TestChunkedInputFilter exte
 
         if (expectPass) {
             assertTrue(client.isResponse200());
-            
assertEquals("null7TestTestTest0123456789abcdefghijABCDEFGHIJopqrstuvwxyz", 
client.getResponseBody());
+            assertEquals("nullnull7TestValue1TestValue2",
+                    client.getResponseBody());
         } else {
             assertTrue(client.getResponseLine(), client.isResponse500());
         }
@@ -206,7 +220,7 @@ public class TestChunkedInputFilter exte
 
         client.connect();
         client.processRequest();
-        assertEquals("null7null", client.getResponseBody());
+        assertEquals("nullnull7nullnull", client.getResponseBody());
     }
 
     private static class EchoHeaderServlet extends HttpServlet {
@@ -217,12 +231,9 @@ public class TestChunkedInputFilter exte
                 throws ServletException, IOException {
             resp.setContentType("text/plain");
             PrintWriter pw = resp.getWriter();
-            // Header not visible yet, body not processed
-            String value = req.getHeader("x-trailer");
-            if (value == null) {
-                value = "null";
-            }
-            pw.write(value);
+            // Headers not visible yet, body not processed
+            dumpHeader("x-trailer1", req, pw);
+            dumpHeader("x-trailer2", req, pw);
 
             // Read the body - quick and dirty
             InputStream is = req.getInputStream();
@@ -233,8 +244,14 @@ public class TestChunkedInputFilter exte
 
             pw.write(Integer.valueOf(count).toString());
 
-            // Header should be visible now
-            value = req.getHeader("x-trailer");
+            // Headers should be visible now
+            dumpHeader("x-trailer1", req, pw);
+            dumpHeader("x-trailer2", req, pw);
+        }
+
+        private void dumpHeader(String headerName, HttpServletRequest req,
+                PrintWriter pw) {
+            String value = req.getHeader(headerName);
             if (value == null) {
                 value = "null";
             }



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

Reply via email to