You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by re...@apache.org on 2024/03/06 14:02:22 UTC

(tomcat) 03/03: Add new suspendWrappedResponseAfterForward

This is an automated email from the ASF dual-hosted git repository.

remm pushed a commit to branch 10.1.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git

commit 6f85b32c545539f36266ef83218d85c9656ae6a9
Author: remm <re...@apache.org>
AuthorDate: Wed Mar 6 11:44:14 2024 +0100

    Add new suspendWrappedResponseAfterForward
    
    This allow configuring the suspend after forward unwrapping.
---
 java/org/apache/catalina/Context.java                   | 17 +++++++++++++++++
 .../org/apache/catalina/core/ApplicationDispatcher.java |  3 ++-
 java/org/apache/catalina/core/StandardContext.java      | 14 ++++++++++++++
 java/org/apache/catalina/startup/FailedContext.java     |  9 +++++++++
 test/org/apache/tomcat/unittest/TesterContext.java      |  5 +++++
 webapps/docs/changelog.xml                              |  5 ++++-
 webapps/docs/config/context.xml                         |  7 +++++++
 7 files changed, 58 insertions(+), 2 deletions(-)

diff --git a/java/org/apache/catalina/Context.java b/java/org/apache/catalina/Context.java
index fb50454dcc..2f66fb46c5 100644
--- a/java/org/apache/catalina/Context.java
+++ b/java/org/apache/catalina/Context.java
@@ -1994,6 +1994,23 @@ public interface Context extends Container, ContextBind {
     void setDispatcherWrapsSameObject(boolean dispatcherWrapsSameObject);
 
 
+    /**
+     * If this is <code>true</code>, then following a forward the response will
+     * be unwrapped to suspend the Catalina response instead of simply closing
+     * the top level response. The default value is <code>true</code>.
+     * @return the flag value
+     */
+    boolean getSuspendWrappedResponseAfterForward();
+
+
+    /**
+     * Allows unwrapping the response object to suspend the response following
+     * a forward.
+     * @param suspendWrappedResponseAfterForward the new flag value
+     */
+    void setSuspendWrappedResponseAfterForward(boolean suspendWrappedResponseAfterForward);
+
+
     /**
      * Find configuration file with the specified path, first looking into the
      * webapp resources, then delegating to
diff --git a/java/org/apache/catalina/core/ApplicationDispatcher.java b/java/org/apache/catalina/core/ApplicationDispatcher.java
index eff85041f6..abb7b2fe4d 100644
--- a/java/org/apache/catalina/core/ApplicationDispatcher.java
+++ b/java/org/apache/catalina/core/ApplicationDispatcher.java
@@ -355,7 +355,8 @@ final class ApplicationDispatcher implements AsyncDispatcher, RequestDispatcher
         if (response instanceof ResponseFacade) {
             finished = true;
             ((ResponseFacade) response).finish();
-        } else if (response instanceof ServletResponseWrapper) {
+        } else if (context.getSuspendWrappedResponseAfterForward()
+                && response instanceof ServletResponseWrapper) {
             ServletResponse baseResponse = response;
             do {
                 baseResponse = ((ServletResponseWrapper) baseResponse).getResponse();
diff --git a/java/org/apache/catalina/core/StandardContext.java b/java/org/apache/catalina/core/StandardContext.java
index 698dadf132..4f13b69a3f 100644
--- a/java/org/apache/catalina/core/StandardContext.java
+++ b/java/org/apache/catalina/core/StandardContext.java
@@ -798,6 +798,8 @@ public class StandardContext extends ContainerBase implements Context, Notificat
 
     private boolean dispatcherWrapsSameObject = Globals.STRICT_SERVLET_COMPLIANCE;
 
+    private boolean suspendWrappedResponseAfterForward = false;
+
     private boolean parallelAnnotationScanning = false;
 
     private boolean useBloomFilterForArchives = false;
@@ -881,6 +883,18 @@ public class StandardContext extends ContainerBase implements Context, Notificat
     }
 
 
+    @Override
+    public boolean getSuspendWrappedResponseAfterForward() {
+        return suspendWrappedResponseAfterForward;
+    }
+
+
+    @Override
+    public void setSuspendWrappedResponseAfterForward(boolean suspendWrappedResponseAfterForward) {
+        this.suspendWrappedResponseAfterForward = suspendWrappedResponseAfterForward;
+    }
+
+
     @Override
     public String getRequestCharacterEncoding() {
         return requestEncoding;
diff --git a/java/org/apache/catalina/startup/FailedContext.java b/java/org/apache/catalina/startup/FailedContext.java
index eb249a1d16..6ca2063a46 100644
--- a/java/org/apache/catalina/startup/FailedContext.java
+++ b/java/org/apache/catalina/startup/FailedContext.java
@@ -1425,4 +1425,13 @@ public class FailedContext extends LifecycleMBeanBase implements Context {
     public void setUseBloomFilterForArchives(boolean useBloomFilterForArchives) {
     }
 
+    @Override
+    public boolean getSuspendWrappedResponseAfterForward() {
+        return false;
+    }
+
+    @Override
+    public void setSuspendWrappedResponseAfterForward(boolean suspendWrappedResponseAfterForward) {
+    }
+
 }
\ No newline at end of file
diff --git a/test/org/apache/tomcat/unittest/TesterContext.java b/test/org/apache/tomcat/unittest/TesterContext.java
index 1b980556cd..3c7a5cdf0c 100644
--- a/test/org/apache/tomcat/unittest/TesterContext.java
+++ b/test/org/apache/tomcat/unittest/TesterContext.java
@@ -1327,4 +1327,9 @@ public class TesterContext implements Context {
         this.useBloomFilterForArchives = useBloomFilterForArchives;
     }
 
+    @Override
+    public boolean getSuspendWrappedResponseAfterForward() { return true; }
+    @Override
+    public void setSuspendWrappedResponseAfterForward(boolean suspendWrappedResponseAfterForward) {}
+
 }
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index a3738aaac3..5d0b29f31c 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -130,7 +130,10 @@
       </fix>
       <fix>
         After forwarding a request, attempt to unwrap the response in order to
-        suspend it, instead of simply closing it if it was wrapped. (remm)
+        suspend it, instead of simply closing it if it was wrapped. Add a new
+        <code>suspendWrappedResponseAfterForward</code> boolean attribute on
+        <code>Context</code> to control the bahavior, defaulting to
+        <code>false</code>. (remm)
       </fix>
     </changelog>
   </subsection>
diff --git a/webapps/docs/config/context.xml b/webapps/docs/config/context.xml
index c233df716f..5097e59f0f 100644
--- a/webapps/docs/config/context.xml
+++ b/webapps/docs/config/context.xml
@@ -596,6 +596,13 @@
         attribute is <code>false</code>.</p>
       </attribute>
 
+      <attribute name="suspendWrappedResponseAfterForward" required="false">
+        <p>If the value of this flag is <code>true</code>, Catalina will
+        suspend wrapped responses after a forward, instead of closing them.
+        If not specified, the default value of the flag is
+        <code>false</code>.</p>
+      </attribute>
+
       <attribute name="swallowAbortedUploads" required="false">
         <p>Set to <code>false</code> if Tomcat should <b>not</b> read any
         additional request body data for aborted uploads and instead abort the


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


Re: (tomcat) 03/03: Add new suspendWrappedResponseAfterForward

Posted by Christopher Schultz <ch...@christopherschultz.net>.
Rémy,

On 3/6/24 09:02, remm@apache.org wrote:
> This is an automated email from the ASF dual-hosted git repository.
> 
> remm pushed a commit to branch 10.1.x
> in repository https://gitbox.apache.org/repos/asf/tomcat.git
> 
> commit 6f85b32c545539f36266ef83218d85c9656ae6a9
> Author: remm <re...@apache.org>
> AuthorDate: Wed Mar 6 11:44:14 2024 +0100
> 
>      Add new suspendWrappedResponseAfterForward
>      
>      This allow configuring the suspend after forward unwrapping.
> ---
>   java/org/apache/catalina/Context.java                   | 17 +++++++++++++++++
>   .../org/apache/catalina/core/ApplicationDispatcher.java |  3 ++-
>   java/org/apache/catalina/core/StandardContext.java      | 14 ++++++++++++++
>   java/org/apache/catalina/startup/FailedContext.java     |  9 +++++++++
>   test/org/apache/tomcat/unittest/TesterContext.java      |  5 +++++
>   webapps/docs/changelog.xml                              |  5 ++++-
>   webapps/docs/config/context.xml                         |  7 +++++++
>   7 files changed, 58 insertions(+), 2 deletions(-)
> 
> diff --git a/java/org/apache/catalina/Context.java b/java/org/apache/catalina/Context.java
> index fb50454dcc..2f66fb46c5 100644
> --- a/java/org/apache/catalina/Context.java
> +++ b/java/org/apache/catalina/Context.java
> @@ -1994,6 +1994,23 @@ public interface Context extends Container, ContextBind {
>       void setDispatcherWrapsSameObject(boolean dispatcherWrapsSameObject);
>   
>   
> +    /**
> +     * If this is <code>true</code>, then following a forward the response will
> +     * be unwrapped to suspend the Catalina response instead of simply closing
> +     * the top level response. The default value is <code>true</code>.
> +     * @return the flag value
> +     */
> +    boolean getSuspendWrappedResponseAfterForward();
> +
> +
> +    /**
> +     * Allows unwrapping the response object to suspend the response following
> +     * a forward.
> +     * @param suspendWrappedResponseAfterForward the new flag value
> +     */
> +    void setSuspendWrappedResponseAfterForward(boolean suspendWrappedResponseAfterForward);
> +
> +
>       /**
>        * Find configuration file with the specified path, first looking into the
>        * webapp resources, then delegating to
> diff --git a/java/org/apache/catalina/core/ApplicationDispatcher.java b/java/org/apache/catalina/core/ApplicationDispatcher.java
> index eff85041f6..abb7b2fe4d 100644
> --- a/java/org/apache/catalina/core/ApplicationDispatcher.java
> +++ b/java/org/apache/catalina/core/ApplicationDispatcher.java
> @@ -355,7 +355,8 @@ final class ApplicationDispatcher implements AsyncDispatcher, RequestDispatcher
>           if (response instanceof ResponseFacade) {
>               finished = true;
>               ((ResponseFacade) response).finish();
> -        } else if (response instanceof ServletResponseWrapper) {
> +        } else if (context.getSuspendWrappedResponseAfterForward()
> +                && response instanceof ServletResponseWrapper) {
>               ServletResponse baseResponse = response;
>               do {
>                   baseResponse = ((ServletResponseWrapper) baseResponse).getResponse();
> diff --git a/java/org/apache/catalina/core/StandardContext.java b/java/org/apache/catalina/core/StandardContext.java
> index 698dadf132..4f13b69a3f 100644
> --- a/java/org/apache/catalina/core/StandardContext.java
> +++ b/java/org/apache/catalina/core/StandardContext.java
> @@ -798,6 +798,8 @@ public class StandardContext extends ContainerBase implements Context, Notificat
>   
>       private boolean dispatcherWrapsSameObject = Globals.STRICT_SERVLET_COMPLIANCE;
>   
> +    private boolean suspendWrappedResponseAfterForward = false;
> +
>       private boolean parallelAnnotationScanning = false;
>   
>       private boolean useBloomFilterForArchives = false;
> @@ -881,6 +883,18 @@ public class StandardContext extends ContainerBase implements Context, Notificat
>       }
>   
>   
> +    @Override
> +    public boolean getSuspendWrappedResponseAfterForward() {
> +        return suspendWrappedResponseAfterForward;
> +    }
> +
> +
> +    @Override
> +    public void setSuspendWrappedResponseAfterForward(boolean suspendWrappedResponseAfterForward) {
> +        this.suspendWrappedResponseAfterForward = suspendWrappedResponseAfterForward;
> +    }
> +
> +
>       @Override
>       public String getRequestCharacterEncoding() {
>           return requestEncoding;
> diff --git a/java/org/apache/catalina/startup/FailedContext.java b/java/org/apache/catalina/startup/FailedContext.java
> index eb249a1d16..6ca2063a46 100644
> --- a/java/org/apache/catalina/startup/FailedContext.java
> +++ b/java/org/apache/catalina/startup/FailedContext.java
> @@ -1425,4 +1425,13 @@ public class FailedContext extends LifecycleMBeanBase implements Context {
>       public void setUseBloomFilterForArchives(boolean useBloomFilterForArchives) {
>       }
>   
> +    @Override
> +    public boolean getSuspendWrappedResponseAfterForward() {
> +        return false;
> +    }
> +
> +    @Override
> +    public void setSuspendWrappedResponseAfterForward(boolean suspendWrappedResponseAfterForward) {
> +    }
> +
>   }
> \ No newline at end of file
> diff --git a/test/org/apache/tomcat/unittest/TesterContext.java b/test/org/apache/tomcat/unittest/TesterContext.java
> index 1b980556cd..3c7a5cdf0c 100644
> --- a/test/org/apache/tomcat/unittest/TesterContext.java
> +++ b/test/org/apache/tomcat/unittest/TesterContext.java
> @@ -1327,4 +1327,9 @@ public class TesterContext implements Context {
>           this.useBloomFilterForArchives = useBloomFilterForArchives;
>       }
>   
> +    @Override
> +    public boolean getSuspendWrappedResponseAfterForward() { return true; }
> +    @Override
> +    public void setSuspendWrappedResponseAfterForward(boolean suspendWrappedResponseAfterForward) {}
> +
>   }
> diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
> index a3738aaac3..5d0b29f31c 100644
> --- a/webapps/docs/changelog.xml
> +++ b/webapps/docs/changelog.xml
> @@ -130,7 +130,10 @@
>         </fix>
>         <fix>
>           After forwarding a request, attempt to unwrap the response in order to
> -        suspend it, instead of simply closing it if it was wrapped. (remm)
> +        suspend it, instead of simply closing it if it was wrapped. Add a new
> +        <code>suspendWrappedResponseAfterForward</code> boolean attribute on
> +        <code>Context</code> to control the bahavior, defaulting to
> +        <code>false</code>. (remm)
>         </fix>
>       </changelog>
>     </subsection>
> diff --git a/webapps/docs/config/context.xml b/webapps/docs/config/context.xml
> index c233df716f..5097e59f0f 100644
> --- a/webapps/docs/config/context.xml
> +++ b/webapps/docs/config/context.xml
> @@ -596,6 +596,13 @@
>           attribute is <code>false</code>.</p>
>         </attribute>
>   
> +      <attribute name="suspendWrappedResponseAfterForward" required="false">
> +        <p>If the value of this flag is <code>true</code>, Catalina will
> +        suspend wrapped responses after a forward, instead of closing them.
> +        If not specified, the default value of the flag is
> +        <code>false</code>.</p>
> +      </attribute>
> +
>         <attribute name="swallowAbortedUploads" required="false">
>           <p>Set to <code>false</code> if Tomcat should <b>not</b> read any
>           additional request body data for aborted uploads and instead abort the

Your javadoc says that the default is true, but the changelog, Context 
documentation, and code say it is false.

-chris

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