Author: markt Date: Sat Mar 7 15:19:09 2015 New Revision: 1664866 URL: http://svn.apache.org/r1664866 Log: Add test cases for https://bz.apache.org/bugzilla/show_bug.cgi?id=57638 Note that this bug does not (currently) affect 9.0.x. The test case is being added for consistency with other branches and to catch regressions.
Modified: tomcat/trunk/test/org/apache/coyote/ajp/TestAbstractAjpProcessor.java Modified: tomcat/trunk/test/org/apache/coyote/ajp/TestAbstractAjpProcessor.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/coyote/ajp/TestAbstractAjpProcessor.java?rev=1664866&r1=1664865&r2=1664866&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/coyote/ajp/TestAbstractAjpProcessor.java (original) +++ tomcat/trunk/test/org/apache/coyote/ajp/TestAbstractAjpProcessor.java Sat Mar 7 15:19:09 2015 @@ -66,6 +66,8 @@ public class TestAbstractAjpProcessor ex private void doSnoopTest(RequestDescriptor desc) throws Exception { + final int ajpPacketSize = 16000; + Map<String, String> requestInfo = desc.getRequestInfo(); Map<String, String> contextInitParameters = desc.getContextInitParameters(); Map<String, String> contextAttributes = desc.getContextAttributes(); @@ -74,6 +76,7 @@ public class TestAbstractAjpProcessor ex Map<String, String> params = desc.getParams(); Tomcat tomcat = getTomcatInstance(); + tomcat.getConnector().setProperty("packetSize", Integer.toString(ajpPacketSize)); // No file system docBase required Context ctx = tomcat.addContext("", null); @@ -81,7 +84,7 @@ public class TestAbstractAjpProcessor ex Tomcat.addServlet(ctx, "snoop", new SnoopServlet()); ctx.addServletMapping("/", "snoop"); - SimpleAjpClient ajpClient = new SimpleAjpClient(); + SimpleAjpClient ajpClient = new SimpleAjpClient(ajpPacketSize); if (requestInfo.get("REQUEST-QUERY-STRING") != null && params.size() > 0) { @@ -91,6 +94,7 @@ public class TestAbstractAjpProcessor ex } String value; + int bodySize = 0; Map<String, String> savedRequestInfo = new HashMap<>(); for (String name: requestInfo.keySet()) { value = requestInfo.get(name); @@ -138,6 +142,10 @@ public class TestAbstractAjpProcessor ex case "REQUEST-CONTENT-LENGTH": headers.put("CONTENT-LENGTH", value); break; + case "REQUEST-BODY-SIZE": + savedRequestInfo.put(name, value); + bodySize = Integer.parseInt(value); + break; case "REQUEST-CONTENT-TYPE": headers.put("CONTENT-TYPE", value); break; @@ -203,6 +211,8 @@ public class TestAbstractAjpProcessor ex case "REQUEST-SECRET": forwardMessage.addAttribute(0x0C, value); break; + case "REQUEST-BODY-SIZE": + break; default: throw(new IllegalArgumentException("Request setting '" + name + "' not supported")); } @@ -286,8 +296,20 @@ public class TestAbstractAjpProcessor ex ajpClient.setPort(getPort()); ajpClient.connect(); + TesterAjpMessage responseHeaders = null; + if (bodySize == 0) { + responseHeaders = ajpClient.sendMessage(forwardMessage); + } else { + TesterAjpMessage bodyMessage = ajpClient.createBodyMessage(new byte[bodySize]); + responseHeaders = ajpClient.sendMessage(forwardMessage, bodyMessage); + // Expect back a request for more data (which will be emty and + // trigger end of stream in Servlet) + validateGetBody(responseHeaders); + bodyMessage = ajpClient.createBodyMessage(new byte[0]); + responseHeaders = ajpClient.sendMessage(bodyMessage); + } + // Expect 3 packets: headers, body, end - TesterAjpMessage responseHeaders = ajpClient.sendMessage(forwardMessage); validateResponseHeaders(responseHeaders, 200, "OK"); String body = extractResponseBody(ajpClient.readMessage()); @@ -446,6 +468,26 @@ public class TestAbstractAjpProcessor ex } @Test + public void testSmallBody() throws Exception { + RequestDescriptor desc = new RequestDescriptor(); + desc.putRequestInfo("REQUEST-METHOD", "PUT"); + desc.putRequestInfo("REQUEST-CONTENT-LENGTH", "100"); + desc.putRequestInfo("REQUEST-BODY-SIZE", "100"); + desc.putRequestInfo("REQUEST-URI", "/testSmallBody"); + doSnoopTest(desc); + } + + @Test + public void testLargeBody() throws Exception { + RequestDescriptor desc = new RequestDescriptor(); + desc.putRequestInfo("REQUEST-METHOD", "PUT"); + desc.putRequestInfo("REQUEST-CONTENT-LENGTH", "10000"); + desc.putRequestInfo("REQUEST-BODY-SIZE", "10000"); + desc.putRequestInfo("REQUEST-URI", "/testLargeBody"); + doSnoopTest(desc); + } + + @Test public void testSecret() throws Exception { Tomcat tomcat = getTomcatInstance(); tomcat.getConnector().setProperty("requiredSecret", "RIGHTSECRET"); @@ -757,6 +799,14 @@ public class TestAbstractAjpProcessor ex } } + private void validateGetBody(TesterAjpMessage message) { + // First two bytes should always be AB + Assert.assertEquals((byte) 'A', message.buf[0]); + Assert.assertEquals((byte) 'B', message.buf[1]); + // Should be a body chunk message + Assert.assertEquals(0x06, message.readByte()); + } + /** * Extract the content from a response message. */ --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org