Author: kkolinko
Date: Thu Jun 14 15:45:56 2012
New Revision: 1350299

URL: http://svn.apache.org/viewvc?rev=1350299&view=rev
Log:
A testcase.

Added:
    tomcat/trunk/test/org/apache/tomcat/util/http/TestMimeHeaders.java   (with 
props)

Added: tomcat/trunk/test/org/apache/tomcat/util/http/TestMimeHeaders.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/tomcat/util/http/TestMimeHeaders.java?rev=1350299&view=auto
==============================================================================
--- tomcat/trunk/test/org/apache/tomcat/util/http/TestMimeHeaders.java (added)
+++ tomcat/trunk/test/org/apache/tomcat/util/http/TestMimeHeaders.java Thu Jun 
14 15:45:56 2012
@@ -0,0 +1,184 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.tomcat.util.http;
+
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.net.SocketException;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServlet;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+import org.apache.catalina.Context;
+import org.apache.catalina.connector.Request;
+import org.apache.catalina.connector.Response;
+import org.apache.catalina.startup.SimpleHttpClient;
+import org.apache.catalina.startup.Tomcat;
+import org.apache.catalina.startup.TomcatBaseTest;
+import org.apache.catalina.valves.TesterAccessLogValve;
+
+public class TestMimeHeaders extends TomcatBaseTest {
+
+    private HeaderCountLogValve alv;
+
+    private void setupHeadersTest(Tomcat tomcat) {
+        Context ctx = tomcat.addContext("", getTemporaryDirectory()
+                .getAbsolutePath());
+        Tomcat.addServlet(ctx, "servlet", new HttpServlet() {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public void service(ServletRequest req, ServletResponse res)
+                    throws ServletException, IOException {
+                res.setContentType("text/plain; charset=ISO-8859-1");
+                res.getWriter().write("OK");
+            }
+        });
+        ctx.addServletMapping("/", "servlet");
+
+        alv = new HeaderCountLogValve();
+        tomcat.getHost().getPipeline().addValve(alv);
+    }
+
+    private void runHeadersTest(final boolean successExpected,
+            final Tomcat tomcat, final int count,
+            final int expectedMaxHeaderCount) throws Exception {
+        tomcat.start();
+
+        String header = "A:B" + SimpleHttpClient.CRLF;
+        StringBuilder request = new StringBuilder();
+        request.append("GET / HTTP/1.0" + SimpleHttpClient.CRLF);
+        for (int i = 0; i < count; i++) {
+            request.append(header);
+        }
+        request.append(SimpleHttpClient.CRLF);
+
+        Client client = new Client(tomcat);
+        client.setRequest(new String[] { request.toString() });
+        try {
+            client.connect();
+            client.processRequest();
+            client.disconnect();
+        } catch (SocketException ex) {
+            // Connection was closed by Tomcat
+            if (successExpected) {
+                // unexpected
+                log.error(ex.getMessage(), ex);
+            } else {
+                log.warn(ex.getMessage(), ex);
+            }
+        }
+        if (successExpected) {
+            alv.validateAccessLog(1, 200, 0, 3000);
+            // Response 200
+            assertTrue("Response line is: " + client.getResponseLine(),
+                    client.getResponseLine() != null && 
client.isResponse200());
+            assertEquals("OK", client.getResponseBody());
+        } else {
+            alv.validateAccessLog(1, 400, 0, 0);
+            // Connection aborted or response 400
+            assertTrue("Response line is: " + client.getResponseLine(),
+                    client.getResponseLine() == null || 
client.isResponse400());
+        }
+        int maxHeaderCount = tomcat.getConnector().getMaxHeaderCount();
+        assertEquals(expectedMaxHeaderCount, maxHeaderCount);
+        if (maxHeaderCount > 0) {
+            assertEquals(maxHeaderCount, alv.arraySize);
+        } else if (maxHeaderCount < 0) {
+            int maxHttpHeaderSize = ((Integer) tomcat.getConnector()
+                    .getAttribute("maxHttpHeaderSize")).intValue();
+            int headerCount = Math.min(count,
+                    maxHttpHeaderSize / header.length() + 1);
+            int arraySize = 1;
+            while (arraySize < headerCount) {
+                arraySize <<= 1;
+            }
+            assertEquals(arraySize, alv.arraySize);
+        }
+    }
+
+    @Test
+    public void testHeaderLimits1() throws Exception {
+        // Bumping into maxHttpHeaderSize
+        Tomcat tomcat = getTomcatInstance();
+        setupHeadersTest(tomcat);
+        tomcat.getConnector().setMaxHeaderCount(-1);
+        runHeadersTest(false, tomcat, 8 * 1024, -1);
+    }
+
+    @Test
+    public void testHeaderLimits2() throws Exception {
+        // Can process 100 headers
+        Tomcat tomcat = getTomcatInstance();
+        setupHeadersTest(tomcat);
+        runHeadersTest(true, tomcat, 100, 100);
+    }
+
+    @Test
+    public void testHeaderLimits3() throws Exception {
+        // Cannot process 101 header
+        Tomcat tomcat = getTomcatInstance();
+        setupHeadersTest(tomcat);
+        runHeadersTest(false, tomcat, 101, 100);
+    }
+
+    @Test
+    public void testHeaderLimits4() throws Exception {
+        // Can change maxHeaderCount
+        Tomcat tomcat = getTomcatInstance();
+        setupHeadersTest(tomcat);
+        tomcat.getConnector().setMaxHeaderCount(-1);
+        runHeadersTest(true, tomcat, 300, -1);
+    }
+
+    private static final class HeaderCountLogValve extends 
TesterAccessLogValve {
+        public volatile int arraySize = -1;
+
+        @Override
+        public void log(Request request, Response response, long time) {
+            super.log(request, response, time);
+            try {
+                MimeHeaders mh = request.getCoyoteRequest().getMimeHeaders();
+                Field headersArrayField = MimeHeaders.class
+                        .getDeclaredField("headers");
+                headersArrayField.setAccessible(true);
+                arraySize = ((Object[]) headersArrayField.get(mh)).length;
+            } catch (Exception ex) {
+                assertNull(ex.getMessage(), ex);
+            }
+        }
+    }
+
+    private static final class Client extends SimpleHttpClient {
+        public Client(Tomcat tomcat) {
+            setPort(tomcat.getConnector().getLocalPort());
+        }
+
+        @Override
+        public boolean isResponseBodyOK() {
+            return true;
+        }
+    }
+}

Propchange: tomcat/trunk/test/org/apache/tomcat/util/http/TestMimeHeaders.java
------------------------------------------------------------------------------
    svn:eol-style = native



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

Reply via email to