This is an automated email from the ASF dual-hosted git repository. markt pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/main by this push: new 50cec9655a Add an option to control how the default servlet performs dir redirects 50cec9655a is described below commit 50cec9655ac357e6d9682eaf3aeea097ace8eda0 Author: Mark Thomas <ma...@apache.org> AuthorDate: Fri Dec 15 14:15:28 2023 +0000 Add an option to control how the default servlet performs dir redirects Based on PR #524 by funkman --- conf/web.xml | 5 +++++ .../apache/catalina/servlets/DefaultServlet.java | 22 +++++++++++++++++++++- .../servlets/TestDefaultServletRedirect.java | 6 ++---- webapps/docs/changelog.xml | 9 +++++++++ webapps/docs/default-servlet.xml | 4 ++++ 5 files changed, 41 insertions(+), 5 deletions(-) diff --git a/conf/web.xml b/conf/web.xml index 89942a9e39..175c308c79 100644 --- a/conf/web.xml +++ b/conf/web.xml @@ -116,6 +116,11 @@ <!-- headers only valid for GET requests, RFC 9110 --> <!-- (which obsoletes RFC 7233) now allows partial --> <!-- puts. [true] --> + <!-- --> + <!-- directoryRedirectStatusCode --> + <!-- Status code to use for directory redirects. --> + <!-- Possible values: 301, 302, 307, 308 --> + <!-- [302] --> <servlet> <servlet-name>default</servlet-name> diff --git a/java/org/apache/catalina/servlets/DefaultServlet.java b/java/org/apache/catalina/servlets/DefaultServlet.java index f9015729b9..535a5bd8e1 100644 --- a/java/org/apache/catalina/servlets/DefaultServlet.java +++ b/java/org/apache/catalina/servlets/DefaultServlet.java @@ -172,6 +172,11 @@ public class DefaultServlet extends HttpServlet { */ protected boolean listings = false; + /** + * Status code to use for directory redirects. + */ + protected int directoryRedirectStatusCode = HttpServletResponse.SC_FOUND; + /** * Read only flag. By default, it's set to true. */ @@ -286,6 +291,21 @@ public class DefaultServlet extends HttpServlet { listings = Boolean.parseBoolean(getServletConfig().getInitParameter("listings")); + if (getServletConfig().getInitParameter("directoryRedirectStatusCode") != null) { + String statusCodeString = getServletConfig().getInitParameter("directoryRedirectStatusCode"); + int statusCode = Integer.parseInt(statusCodeString); + switch (statusCode) { + case HttpServletResponse.SC_MOVED_PERMANENTLY: + case HttpServletResponse.SC_FOUND: + case HttpServletResponse.SC_TEMPORARY_REDIRECT: + case HttpServletResponse.SC_PERMANENT_REDIRECT: + directoryRedirectStatusCode = statusCode; + break; + default: + log("Invalid redirectStatusCode of " + statusCode); + } + } + if (getServletConfig().getInitParameter("readonly") != null) { readOnly = Boolean.parseBoolean(getServletConfig().getInitParameter("readonly")); } @@ -1376,7 +1396,7 @@ public class DefaultServlet extends HttpServlet { while (location.length() > 1 && location.charAt(1) == '/') { location.deleteCharAt(0); } - response.sendRedirect(response.encodeRedirectURL(location.toString())); + response.sendRedirect(response.encodeRedirectURL(location.toString()), directoryRedirectStatusCode); } /** diff --git a/test/org/apache/catalina/servlets/TestDefaultServletRedirect.java b/test/org/apache/catalina/servlets/TestDefaultServletRedirect.java index 1a455c9fb2..fd42b0f574 100644 --- a/test/org/apache/catalina/servlets/TestDefaultServletRedirect.java +++ b/test/org/apache/catalina/servlets/TestDefaultServletRedirect.java @@ -31,7 +31,6 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.junit.Assert; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -62,7 +61,6 @@ public class TestDefaultServletRedirect extends TomcatBaseTest { @Parameter(0) public int redirectStatus; - @Ignore // See PR #524 @Test public void testRedirect() throws Exception { Tomcat tomcat = getTomcatInstance(); @@ -74,7 +72,7 @@ public class TestDefaultServletRedirect extends TomcatBaseTest { Wrapper defaultServlet = Tomcat.addServlet(ctx, "default", new DefaultServlet()); defaultServlet.addMapping("/"); - defaultServlet.addInitParameter("redirectStatusCode", Integer.toString(redirectStatus)); + defaultServlet.addInitParameter("directoryRedirectStatusCode", Integer.toString(redirectStatus)); tomcat.start(); @@ -99,7 +97,7 @@ public class TestDefaultServletRedirect extends TomcatBaseTest { Wrapper defaultServlet = Tomcat.addServlet(ctx, "default", new DefaultServlet()); defaultServlet.addMapping("/"); - defaultServlet.addInitParameter("redirectStatusCode", Integer.toString(redirectStatus)); + defaultServlet.addInitParameter("directoryRedirectStatusCode", Integer.toString(redirectStatus)); Wrapper includeServlet = Tomcat.addServlet(ctx, "include", new IncludeServlet()); includeServlet.addMapping("/include"); diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index b1dd06f93c..1fd8f931cb 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -105,6 +105,15 @@ issues do not "pop up" wrt. others). --> <section name="Tomcat 11.0.0-M16 (markt)" rtext="in development"> + <subsection name="Catalina"> + <changelog> + <add> + Allow alternate redirect status code for directory redirects issued by + the default servlet via the init param + <code>directoryRedirectStatusCode</code>. (funkman/markt) + </add> + </changelog> + </subsection> <subsection name="Coyote"> <changelog> <fix> diff --git a/webapps/docs/default-servlet.xml b/webapps/docs/default-servlet.xml index 33ce47e434..07a6b9a7bc 100644 --- a/webapps/docs/default-servlet.xml +++ b/webapps/docs/default-servlet.xml @@ -211,6 +211,10 @@ Tomcat.</p> valid for GET requests, RFC 9110 (which obsoletes RFC 7233) now allows partial puts. [true] </property> + <property name="directoryRedirectStatusCode"> + When a directory redirect (trailing slash missing) is made, use this as + the the HTTP response code. [302] + </property> </properties> </section> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org