You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by kk...@apache.org on 2011/11/25 15:50:43 UTC

svn commit: r1206200 - in /tomcat/trunk: java/org/apache/catalina/connector/Request.java test/org/apache/catalina/connector/TestRequest.java test/org/apache/catalina/startup/SimpleHttpClient.java

Author: kkolinko
Date: Fri Nov 25 14:50:42 2011
New Revision: 1206200

URL: http://svn.apache.org/viewvc?rev=1206200&view=rev
Log:
Do not throw IllegalArgumentException from within parseParameters when chunked POST request is too large,
but treat it like an IO error.

Modified:
    tomcat/trunk/java/org/apache/catalina/connector/Request.java
    tomcat/trunk/test/org/apache/catalina/connector/TestRequest.java
    tomcat/trunk/test/org/apache/catalina/startup/SimpleHttpClient.java

Modified: tomcat/trunk/java/org/apache/catalina/connector/Request.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/Request.java?rev=1206200&r1=1206199&r2=1206200&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/Request.java (original)
+++ tomcat/trunk/java/org/apache/catalina/connector/Request.java Fri Nov 25 14:50:42 2011
@@ -2867,7 +2867,7 @@ public class Request
                 try {
                     formData = readChunkedPostBody();
                 } catch (IOException e) {
-                    // Client disconnect
+                    // Client disconnect or chunkedPostTooLarge error
                     if (context.getLogger().isDebugEnabled()) {
                         context.getLogger().debug(
                                 sm.getString("coyoteRequest.parseParameters"), e);
@@ -2922,7 +2922,7 @@ public class Request
                     (body.getLength() + len) > connector.getMaxPostSize()) {
                 // Too much data
                 checkSwallowInput();
-                throw new IllegalArgumentException(
+                throw new IOException(
                         sm.getString("coyoteRequest.chunkedPostTooLarge"));
             }
             if (len > 0) {

Modified: tomcat/trunk/test/org/apache/catalina/connector/TestRequest.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/connector/TestRequest.java?rev=1206200&r1=1206199&r2=1206200&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/connector/TestRequest.java (original)
+++ tomcat/trunk/test/org/apache/catalina/connector/TestRequest.java Fri Nov 25 14:50:42 2011
@@ -38,7 +38,10 @@ import org.junit.Test;
 
 import org.apache.catalina.Context;
 import org.apache.catalina.authenticator.BasicAuthenticator;
+import org.apache.catalina.deploy.FilterDef;
+import org.apache.catalina.deploy.FilterMap;
 import org.apache.catalina.deploy.LoginConfig;
+import org.apache.catalina.filters.FailedRequestFilter;
 import org.apache.catalina.startup.SimpleHttpClient;
 import org.apache.catalina.startup.TestTomcat.MapRealm;
 import org.apache.catalina.startup.Tomcat;
@@ -58,7 +61,7 @@ public class TestRequest extends TomcatB
      */
     @Test
     public void testBug37794() {
-        Bug37794Client client = new Bug37794Client();
+        Bug37794Client client = new Bug37794Client(true);
         client.setPort(getPort());
 
         // Edge cases around zero
@@ -71,14 +74,14 @@ public class TestRequest extends TomcatB
         assertTrue(client.isResponseBodyOK());
         client.reset();
         client.doRequest(1, false); // 1 byte - too small should fail
-        assertTrue(client.isResponse500());
+        assertTrue(client.isResponse400());
 
         client.reset();
 
         // Edge cases around actual content length
         client.reset();
         client.doRequest(6, false); // Too small should fail
-        assertTrue(client.isResponse500());
+        assertTrue(client.isResponse400());
         client.reset();
         client.doRequest(7, false); // Just enough should pass
         assertTrue(client.isResponse200());
@@ -101,6 +104,23 @@ public class TestRequest extends TomcatB
         assertTrue(client.isResponseBodyOK());
     }
 
+    /**
+     * Additional test for failed requests handling when no FailedRequestFilter
+     * is defined.
+     */
+    @Test
+    public void testBug37794withoutFilter() {
+        Bug37794Client client = new Bug37794Client(false);
+        client.setPort(getPort());
+
+        // Edge cases around actual content length
+        client.reset();
+        client.doRequest(6, false); // Too small should fail
+        // Response code will be OK, but parameters list will be empty
+        assertTrue(client.isResponse200());
+        assertEquals("", client.getResponseBody());
+    }
+
     private static class Bug37794Servlet extends HttpServlet {
 
         private static final long serialVersionUID = 1L;
@@ -130,8 +150,14 @@ public class TestRequest extends TomcatB
      */
     private class Bug37794Client extends SimpleHttpClient {
 
+        private final boolean createFilter;
+
         private boolean init;
 
+        public Bug37794Client(boolean createFilter) {
+            this.createFilter = createFilter;
+        }
+
         private synchronized void init() throws Exception {
             if (init) return;
 
@@ -139,6 +165,19 @@ public class TestRequest extends TomcatB
             Context root = tomcat.addContext("", TEMP_DIR);
             Tomcat.addServlet(root, "Bug37794", new Bug37794Servlet());
             root.addServletMapping("/test", "Bug37794");
+
+            if (createFilter) {
+                FilterDef failedRequestFilter = new FilterDef();
+                failedRequestFilter.setFilterName("failedRequestFilter");
+                failedRequestFilter.setFilterClass(
+                        FailedRequestFilter.class.getName());
+                FilterMap failedRequestFilterMap = new FilterMap();
+                failedRequestFilterMap.setFilterName("failedRequestFilter");
+                failedRequestFilterMap.addURLPattern("/*");
+                root.addFilterDef(failedRequestFilter);
+                root.addFilterMap(failedRequestFilterMap);
+            }
+
             tomcat.start();
 
             init = true;

Modified: tomcat/trunk/test/org/apache/catalina/startup/SimpleHttpClient.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/startup/SimpleHttpClient.java?rev=1206200&r1=1206199&r2=1206200&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/startup/SimpleHttpClient.java (original)
+++ tomcat/trunk/test/org/apache/catalina/startup/SimpleHttpClient.java Fri Nov 25 14:50:42 2011
@@ -46,6 +46,7 @@ public abstract class SimpleHttpClient {
     public static final String INFO_100 = "HTTP/1.1 100";
     public static final String OK_200 = "HTTP/1.1 200";
     public static final String REDIRECT_302 = "HTTP/1.1 302";
+    public static final String FAIL_400 = "HTTP/1.1 400";
     public static final String FAIL_404 = "HTTP/1.1 404";
     public static final String FAIL_413 = "HTTP/1.1 413";
     public static final String FAIL_50X = "HTTP/1.1 50";
@@ -244,6 +245,10 @@ public abstract class SimpleHttpClient {
         return getResponseLine().startsWith(REDIRECT_302);
     }
 
+    public boolean isResponse400() {
+        return getResponseLine().startsWith(FAIL_400);
+    }
+
     public boolean isResponse404() {
         return getResponseLine().startsWith(FAIL_404);
     }



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