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

Reply via email to