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-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org