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 2020/10/15 16:32:39 UTC

[tomcat] 01/02: Add a test for connectionUploadTimeout/disableUploadTimeout

This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch 7.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git

commit 09dec729ced9fe8cf1d7245b56189825134bb850
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Thu Oct 15 15:21:53 2020 +0100

    Add a test for connectionUploadTimeout/disableUploadTimeout
---
 .../org/apache/catalina/startup/TesterServlet.java | 17 +++++
 .../coyote/http11/TestAbstractHttp11Processor.java | 88 ++++++++++++++++++++++
 2 files changed, 105 insertions(+)

diff --git a/test/org/apache/catalina/startup/TesterServlet.java b/test/org/apache/catalina/startup/TesterServlet.java
index 324d3f4..59851c9 100644
--- a/test/org/apache/catalina/startup/TesterServlet.java
+++ b/test/org/apache/catalina/startup/TesterServlet.java
@@ -28,6 +28,19 @@ public class TesterServlet extends HttpServlet {
 
     private static final long serialVersionUID = 1L;
 
+    private final boolean explicitClose;
+
+
+    public TesterServlet() {
+        this(false);
+    }
+
+
+    public TesterServlet(boolean explicitClose) {
+        this.explicitClose = explicitClose;
+    }
+
+
     @Override
     protected void doGet(HttpServletRequest req, HttpServletResponse resp)
             throws ServletException, IOException {
@@ -35,5 +48,9 @@ public class TesterServlet extends HttpServlet {
         resp.setContentType("text/plain");
         PrintWriter out = resp.getWriter();
         out.print("OK");
+
+        if (explicitClose) {
+            resp.setHeader("Connection", "close");
+        }
     }
 }
diff --git a/test/org/apache/coyote/http11/TestAbstractHttp11Processor.java b/test/org/apache/coyote/http11/TestAbstractHttp11Processor.java
index 0d9f0ed..2ff32f3 100644
--- a/test/org/apache/coyote/http11/TestAbstractHttp11Processor.java
+++ b/test/org/apache/coyote/http11/TestAbstractHttp11Processor.java
@@ -48,6 +48,7 @@ import org.junit.Test;
 
 import org.apache.catalina.Context;
 import org.apache.catalina.Wrapper;
+import org.apache.catalina.connector.Connector;
 import org.apache.catalina.deploy.SecurityCollection;
 import org.apache.catalina.deploy.SecurityConstraint;
 import org.apache.catalina.startup.SimpleHttpClient;
@@ -1627,4 +1628,91 @@ public class TestAbstractHttp11Processor extends TomcatBaseTest {
             out.print(" and request.getServerPort() is " + req.getServerPort());
         }
     }
+
+
+    @Test
+    public void testSlowUploadTimeoutWithLongerUploadTimeout() throws Exception {
+        doTestSlowUploadTimeout(true);
+    }
+
+
+    @Test
+    public void testSlowUploadTimeoutWithoutLongerUploadTimeout() throws Exception {
+        doTestSlowUploadTimeout(false);
+    }
+
+
+    private void doTestSlowUploadTimeout(boolean useLongerUploadTimeout) throws Exception {
+        Tomcat tomcat = getTomcatInstance();
+        Connector connector = tomcat.getConnector();
+
+        int connectionTimeout = ((Integer) connector.getProperty("connectionTimeout")).intValue();
+
+        // These factors should make the differences large enough that the CI
+        // tests pass consistently. If not, may need to reduce connectionTimeout
+        // and increase delay and connectionUploadTimeout
+        int delay = connectionTimeout * 2;
+        int connectionUploadTimeout = connectionTimeout * 4;
+
+        if (useLongerUploadTimeout) {
+            connector.setProperty("connectionUploadTimeout", "" + connectionUploadTimeout);
+            connector.setProperty("disableUploadTimeout", "false");
+        }
+
+        // No file system docBase required
+        Context ctx = tomcat.addContext("", null);
+
+        // Add servlet
+        Tomcat.addServlet(ctx, "TesterServlet", new SwallowBodyTesterServlet());
+        ctx.addServletMapping("/foo", "TesterServlet");
+
+        tomcat.start();
+
+        String request =
+                "POST /foo HTTP/1.1" + SimpleHttpClient.CRLF +
+                "Host: localhost:" + getPort() + SimpleHttpClient.CRLF +
+                "Content-Length: 10" + SimpleHttpClient.CRLF +
+                 SimpleHttpClient.CRLF;
+
+        Client client = new Client(tomcat.getConnector().getLocalPort());
+        client.setRequest(new String[] {request, "XXXXXXXXXX"});
+        client.setRequestPause(delay);
+
+        client.connect();
+        client.processRequest();
+
+        if (useLongerUploadTimeout) {
+            // Expected response is a 200 response.
+            Assert.assertTrue(client.isResponse200());
+            Assert.assertEquals("OK", client.getResponseBody());
+        } else {
+            // Different failure modes with different connectors
+            Assert.assertFalse(client.isResponse200());
+        }
+    }
+
+
+    private static class SwallowBodyTesterServlet extends TesterServlet {
+
+        private static final long serialVersionUID = 1L;
+
+        public SwallowBodyTesterServlet() {
+            super(true);
+        }
+
+        @Override
+        protected void doPost(HttpServletRequest req, HttpServletResponse resp)
+                throws ServletException, IOException {
+
+            // Swallow the body
+            byte[] buf = new byte[1024];
+            InputStream is = req.getInputStream();
+            while (is.read(buf) > 0) {
+                // Loop
+            }
+
+            // Standard response
+            doGet(req, resp);
+        }
+    }
 }


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