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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]