import org.apache.catalina.core.StandardContext;
import org.apache.catalina.startup.SimpleHttpClient;
-import org.apache.catalina.startup.TestTomcatBase;
+import org.apache.catalina.startup.TomcatBaseTest;
import org.apache.catalina.startup.Tomcat;
-public class TestKeepAliveCount extends TestTomcatBase{
+public class TestKeepAliveCount extends TomcatBaseTest{
public void testHttp10() throws Exception {
TestKeepAliveClient client = new TestKeepAliveClient();
import org.apache.catalina.core.StandardContext;
import org.apache.catalina.startup.SimpleHttpClient;
-import org.apache.catalina.startup.TestTomcatBase;
+import org.apache.catalina.startup.TomcatBaseTest;
import org.apache.catalina.startup.Tomcat;
/**
* Test case for {@link Request}.
*/
-public class TestRequest extends TestTomcatBase {
+public class TestRequest extends TomcatBaseTest {
/**
* Test case for https://issues.apache.org/bugzilla/show_bug.cgi?id=37794
import org.apache.catalina.deploy.FilterDef;
import org.apache.catalina.deploy.FilterMap;
import org.apache.catalina.startup.SimpleHttpClient;
-import org.apache.catalina.startup.TestTomcatBase;
+import org.apache.catalina.startup.TomcatBaseTest;
import org.apache.catalina.startup.Tomcat;
-public class TestStandardContext extends TestTomcatBase {
+public class TestStandardContext extends TomcatBaseTest {
private static final String REQUEST =
"GET / HTTP/1.1\r\n" +
import org.apache.catalina.deploy.ContextEnvironment;
import org.apache.tomcat.util.buf.ByteChunk;
-public class TestTomcat extends TestTomcatBase {
+public class TestTomcat extends TomcatBaseTest {
/**
* Simple servlet to test in-line registration
+++ /dev/null
-/*
- * 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.catalina.startup;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PrintWriter;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.util.List;
-import java.util.Map;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.tomcat.util.buf.ByteChunk;
-
-import junit.framework.TestCase;
-
-/**
- * Base test case that provides a Tomcat instance for each test - mainly so we
- * don't have to keep writing the cleanup code.
- */
-public abstract class TestTomcatBase extends TestCase {
- private Tomcat tomcat;
- private File tempDir;
- private static int port = 8001;
-
- /**
- * Make Tomcat instance accessible to sub-classes.
- */
- public Tomcat getTomcatInstance() {
- return tomcat;
- }
-
- /**
- * Sub-classes need to know port so they can connect
- */
- public int getPort() {
- return port;
- }
-
- public void setUp() throws Exception {
- tempDir = new File("output/tmp");
- tempDir.mkdir();
-
- tomcat = new Tomcat();
- tomcat.setBaseDir(tempDir.getAbsolutePath());
- tomcat.getHost().setAppBase(tempDir.getAbsolutePath() + "/webapps");
-
- // If each test is running on same port - they
- // may interfere with each other (on unix at least)
- port++;
- tomcat.setPort(port);
- }
-
- public void tearDown() throws Exception {
- tomcat.stop();
- ExpandWar.delete(tempDir);
- }
-
- /**
- * Simple Hello World servlet for use by test cases
- */
- public static final class HelloWorldServlet extends HttpServlet {
-
- private static final long serialVersionUID = 1L;
-
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- PrintWriter out = resp.getWriter();
- out.print("<html><body><p>Hello World</p></body></html>");
- }
- }
-
-
- /**
- * Wrapper for getting the response.
- */
- public static ByteChunk getUrl(String path) throws IOException {
- ByteChunk out = new ByteChunk();
- getUrl(path, out, null);
- return out;
- }
-
- public static int getUrl(String path,
- ByteChunk out,
- Map<String, List<String>> resHead) throws IOException {
- URL url = new URL(path);
- HttpURLConnection connection =
- (HttpURLConnection) url.openConnection();
- connection.setReadTimeout(100000);
- connection.connect();
- int rc = connection.getResponseCode();
- if (resHead != null) {
- Map<String, List<String>> head = connection.getHeaderFields();
- resHead.putAll(head);
- }
- InputStream is = connection.getInputStream();
- BufferedInputStream bis = new BufferedInputStream(is);
- byte[] buf = new byte[2048];
- int rd = 0;
- while((rd = bis.read(buf)) > 0) {
- out.append(buf, 0, rd);
- }
- return rc;
- }
-}
--- /dev/null
+/*
+ * 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.catalina.startup;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintWriter;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.tomcat.util.buf.ByteChunk;
+
+import junit.framework.TestCase;
+
+/**
+ * Base test case that provides a Tomcat instance for each test - mainly so we
+ * don't have to keep writing the cleanup code.
+ */
+public abstract class TomcatBaseTest extends TestCase {
+ private Tomcat tomcat;
+ private File tempDir;
+ private static int port = 8001;
+
+ /**
+ * Make Tomcat instance accessible to sub-classes.
+ */
+ public Tomcat getTomcatInstance() {
+ return tomcat;
+ }
+
+ /**
+ * Sub-classes need to know port so they can connect
+ */
+ public int getPort() {
+ return port;
+ }
+
+ public void setUp() throws Exception {
+ tempDir = new File("output/tmp");
+ tempDir.mkdir();
+
+ tomcat = new Tomcat();
+ tomcat.setBaseDir(tempDir.getAbsolutePath());
+ tomcat.getHost().setAppBase(tempDir.getAbsolutePath() + "/webapps");
+
+ // If each test is running on same port - they
+ // may interfere with each other (on unix at least)
+ port++;
+ tomcat.setPort(port);
+ }
+
+ public void tearDown() throws Exception {
+ tomcat.stop();
+ ExpandWar.delete(tempDir);
+ }
+
+ /**
+ * Simple Hello World servlet for use by test cases
+ */
+ public static final class HelloWorldServlet extends HttpServlet {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void doGet(HttpServletRequest req, HttpServletResponse resp)
+ throws ServletException, IOException {
+ PrintWriter out = resp.getWriter();
+ out.print("<html><body><p>Hello World</p></body></html>");
+ }
+ }
+
+
+ /**
+ * Wrapper for getting the response.
+ */
+ public static ByteChunk getUrl(String path) throws IOException {
+ ByteChunk out = new ByteChunk();
+ getUrl(path, out, null);
+ return out;
+ }
+
+ public static int getUrl(String path,
+ ByteChunk out,
+ Map<String, List<String>> resHead) throws IOException {
+ URL url = new URL(path);
+ HttpURLConnection connection =
+ (HttpURLConnection) url.openConnection();
+ connection.setReadTimeout(100000);
+ connection.connect();
+ int rc = connection.getResponseCode();
+ if (resHead != null) {
+ Map<String, List<String>> head = connection.getHeaderFields();
+ resHead.putAll(head);
+ }
+ InputStream is = connection.getInputStream();
+ BufferedInputStream bis = new BufferedInputStream(is);
+ byte[] buf = new byte[2048];
+ int rd = 0;
+ while((rd = bis.read(buf)) > 0) {
+ out.append(buf, 0, rd);
+ }
+ return rc;
+ }
+}
--- /dev/null
+/*
+ * 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 javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.catalina.core.StandardContext;
+import org.apache.catalina.startup.TomcatBaseTest;
+import org.apache.catalina.startup.Tomcat;
+
+/**
+ * Base Test case for {@link Cookies}. <b>Note</b> because of the use of
+ * <code>final static</code> constants in {@link Cookies}, each of these tests
+ * must be executed in a new JVM instance. The tests have been place in separate
+ * classes to facilitate this when running the unit tests via Ant.
+ */
+public abstract class CookiesBaseTest extends TomcatBaseTest {
+
+ /**
+ * Servlet for cookie naming test.
+ */
+ public static class CookieName extends HttpServlet {
+
+ private static final long serialVersionUID = 1L;
+
+ private final String cookieName;
+
+ public CookieName(String cookieName) {
+ this.cookieName = cookieName;
+ }
+
+ public void doGet(HttpServletRequest req, HttpServletResponse res)
+ throws IOException {
+ try {
+ Cookie cookie = new Cookie(cookieName,"Value");
+ res.addCookie(cookie);
+ res.getWriter().write("Cookie name ok");
+ } catch (IllegalArgumentException iae) {
+ res.getWriter().write("Cookie name fail");
+ }
+ }
+
+ }
+
+
+ public static void addServlets(Tomcat tomcat) {
+ // Must have a real docBase - just use temp
+ StandardContext ctx =
+ tomcat.addContext("/", System.getProperty("java.io.tmpdir"));
+
+ Tomcat.addServlet(ctx, "invalid", new CookieName("na;me"));
+ ctx.addServletMapping("/invalid", "invalid");
+ Tomcat.addServlet(ctx, "invalidFwd", new CookieName("na/me"));
+ ctx.addServletMapping("/invalidFwd", "invalidFwd");
+ Tomcat.addServlet(ctx, "invalidStrict", new CookieName("na?me"));
+ ctx.addServletMapping("/invalidStrict", "invalidStrict");
+ Tomcat.addServlet(ctx, "valid", new CookieName("name"));
+ ctx.addServletMapping("/valid", "valid");
+
+ }
+
+ public abstract void testCookiesInstance() throws Exception;
+
+}
--- /dev/null
+/*
+ * 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 org.apache.catalina.startup.Tomcat;
+import org.apache.tomcat.util.buf.ByteChunk;
+
+/**
+ * Test case for {@link Cookies}. <b>Note</b> because of the use of <code>final
+ * static</code> constants in {@link Cookies}, each of these tests must be
+ * executed in a new JVM instance. The tests have been place in separate classes
+ * to facilitate this when running the unit tests via Ant.
+ */
+public class TestCookiesDefaultSysProps extends CookiesBaseTest {
+
+ @Override
+ public void testCookiesInstance() throws Exception {
+
+ Tomcat tomcat = getTomcatInstance();
+
+ addServlets(tomcat);
+
+ tomcat.start();
+
+ ByteChunk res = getUrl("http://localhost:" + getPort() + "/invalid");
+ assertEquals("Cookie name fail", res.toString());
+ res = getUrl("http://localhost:" + getPort() + "/invalidFwd");
+ assertEquals("Cookie name ok", res.toString());
+ res = getUrl("http://localhost:" + getPort() + "/invalidStrict");
+ assertEquals("Cookie name ok", res.toString());
+ res = getUrl("http://localhost:" + getPort() + "/valid");
+ assertEquals("Cookie name ok", res.toString());
+
+ }
+
+}
--- /dev/null
+/*
+ * 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 org.apache.catalina.startup.Tomcat;
+import org.apache.tomcat.util.buf.ByteChunk;
+
+/**
+ * Test case for {@link Cookies}. <b>Note</b> because of the use of <code>final
+ * static</code> constants in {@link Cookies}, each of these tests must be
+ * executed in a new JVM instance. The tests have been place in separate classes
+ * to facilitate this when running the unit tests via Ant.
+ */
+public class TestCookiesNoFwdStrictSysProps extends CookiesBaseTest {
+
+ public void testCookiesInstance() throws Exception {
+
+ System.setProperty("org.apache.catalina.STRICT_SERVLET_COMPLIANCE",
+ "true");
+ System.setProperty("org.apache.tomcat.util.http.ServerCookie.FWD_SLASH_IS_SEPARATOR",
+ "false");
+
+ Tomcat tomcat = getTomcatInstance();
+
+ addServlets(tomcat);
+
+ tomcat.start();
+
+ ByteChunk res = getUrl("http://localhost:" + getPort() + "/invalid");
+ assertEquals("Cookie name fail", res.toString());
+ res = getUrl("http://localhost:" + getPort() + "/invalidFwd");
+ assertEquals("Cookie name ok", res.toString());
+ res = getUrl("http://localhost:" + getPort() + "/invalidStrict");
+ assertEquals("Cookie name fail", res.toString());
+ res = getUrl("http://localhost:" + getPort() + "/valid");
+ assertEquals("Cookie name ok", res.toString());
+
+ }
+
+}
--- /dev/null
+/*
+ * 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 org.apache.catalina.startup.Tomcat;
+import org.apache.tomcat.util.buf.ByteChunk;
+
+/**
+ * Test case for {@link Cookies}. <b>Note</b> because of the use of <code>final
+ * static</code> constants in {@link Cookies}, each of these tests must be
+ * executed in a new JVM instance. The tests have been place in separate classes
+ * to facilitate this when running the unit tests via Ant.
+ */
+public class TestCookiesNoStrictNamingSysProps extends CookiesBaseTest {
+
+ @Override
+ public void testCookiesInstance() throws Exception {
+
+ System.setProperty("org.apache.catalina.STRICT_SERVLET_COMPLIANCE",
+ "true");
+ System.setProperty("org.apache.tomcat.util.http.ServerCookie.STRICT_NAMING",
+ "false");
+
+ Tomcat tomcat = getTomcatInstance();
+
+ addServlets(tomcat);
+
+ tomcat.start();
+
+ ByteChunk res = getUrl("http://localhost:" + getPort() + "/invalid");
+ assertEquals("Cookie name fail", res.toString());
+ res = getUrl("http://localhost:" + getPort() + "/invalidFwd");
+ assertEquals("Cookie name ok", res.toString());
+ res = getUrl("http://localhost:" + getPort() + "/invalidStrict");
+ assertEquals("Cookie name ok", res.toString());
+ res = getUrl("http://localhost:" + getPort() + "/valid");
+ assertEquals("Cookie name ok", res.toString());
+
+ }
+}
--- /dev/null
+/*
+ * 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 org.apache.catalina.startup.Tomcat;
+import org.apache.tomcat.util.buf.ByteChunk;
+
+/**
+ * Test case for {@link Cookies}. <b>Note</b> because of the use of <code>final
+ * static</code> constants in {@link Cookies}, each of these tests must be
+ * executed in a new JVM instance. The tests have been place in separate classes
+ * to facilitate this when running the unit tests via Ant.
+ */
+public class TestCookiesStrictSysProps extends CookiesBaseTest {
+
+ @Override
+ public void testCookiesInstance() throws Exception {
+
+ System.setProperty("org.apache.catalina.STRICT_SERVLET_COMPLIANCE",
+ "true");
+
+ Tomcat tomcat = getTomcatInstance();
+
+ addServlets(tomcat);
+
+ tomcat.start();
+
+ ByteChunk res = getUrl("http://localhost:" + getPort() + "/invalid");
+ assertEquals("Cookie name fail", res.toString());
+ res = getUrl("http://localhost:" + getPort() + "/invalidFwd");
+ assertEquals("Cookie name fail", res.toString());
+ res = getUrl("http://localhost:" + getPort() + "/invalidStrict");
+ assertEquals("Cookie name fail", res.toString());
+ res = getUrl("http://localhost:" + getPort() + "/valid");
+ assertEquals("Cookie name ok", res.toString());
+
+ }
+
+}