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

lukaszlenart pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/struts.git


The following commit(s) were added to refs/heads/master by this push:
     new afd04ea5a WW-5199 Allow forwarding from/to actions
     new 579796de5 Merge pull request #642 from atlassian/WW-5199-forward-action
afd04ea5a is described below

commit afd04ea5af64768ba61b941a4fdd277674196820
Author: Kusal Kithul-Godage <g...@kusal.io>
AuthorDate: Fri Dec 9 00:26:40 2022 +1100

    WW-5199 Allow forwarding from/to actions
---
 .../org/apache/struts2/showcase/DispatcherResultTest.java |  9 ++-------
 .../org/apache/struts2/dispatcher/PrepareOperations.java  | 15 +++++++++++----
 .../struts2/dispatcher/filter/StrutsExecuteFilter.java    | 13 +++----------
 .../struts2/dispatcher/filter/StrutsPrepareFilter.java    |  2 +-
 4 files changed, 17 insertions(+), 22 deletions(-)

diff --git 
a/apps/showcase/src/test/java/it/org/apache/struts2/showcase/DispatcherResultTest.java
 
b/apps/showcase/src/test/java/it/org/apache/struts2/showcase/DispatcherResultTest.java
index 6564270c2..3819e27ab 100644
--- 
a/apps/showcase/src/test/java/it/org/apache/struts2/showcase/DispatcherResultTest.java
+++ 
b/apps/showcase/src/test/java/it/org/apache/struts2/showcase/DispatcherResultTest.java
@@ -43,13 +43,8 @@ public class DispatcherResultTest {
             webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
             final HtmlPage page = 
webClient.getPage(ParameterUtils.getBaseUrl() + "/dispatcher/forward.action");
 
-            //DomElement div = page.getElementById("dispatcher-result");
-            //Assert.assertEquals("This page is a result of \"dispatching\" to 
it from an action", div.asNormalizedText());
-            // support for forwarding to another action is broken on 
StrutsPrepareFilter/StrutsExecuteFilter
-            // it only works in StrutsPrepareAndExecuteFilter
-            // this will be fixed in Struts 6.1.x
-
-            Assert.assertEquals(404, page.getWebResponse().getStatusCode());
+            DomElement div = page.getElementById("dispatcher-result");
+            Assert.assertEquals("This page is a result of \"dispatching\" to 
it from an action", div.asNormalizedText());
         }
     }
 
diff --git 
a/core/src/main/java/org/apache/struts2/dispatcher/PrepareOperations.java 
b/core/src/main/java/org/apache/struts2/dispatcher/PrepareOperations.java
index 1d6981bb1..a25e372cf 100644
--- a/core/src/main/java/org/apache/struts2/dispatcher/PrepareOperations.java
+++ b/core/src/main/java/org/apache/struts2/dispatcher/PrepareOperations.java
@@ -52,6 +52,7 @@ public class PrepareOperations {
 
     private Dispatcher dispatcher;
     private static final String STRUTS_ACTION_MAPPING_KEY = 
"struts.actionMapping";
+    private static final String NO_ACTION_MAPPING = "noActionMapping";
     public static final String CLEANUP_RECURSION_COUNTER = 
"__cleanup_recursion_counter";
 
     public PrepareOperations(Dispatcher dispatcher) {
@@ -73,7 +74,7 @@ public class PrepareOperations {
         if (oldCounter != null) {
             counter = oldCounter + 1;
         }
-        
+
         ActionContext oldContext = ActionContext.getContext();
         if (oldContext != null) {
             // detected existing context, so we are probably in a forward
@@ -172,7 +173,7 @@ public class PrepareOperations {
      * has already been found, otherwise, it creates it and stores it in the 
request.  No mapping will be created in the
      * case of static resource requests or unidentifiable requests for other 
servlets, for example.
      * @param forceLookup if true, the action mapping will be looked up from 
the ActionMapper instance, ignoring if there is one
-     * in the request or not 
+     * in the request or not
      *
      * @param request servlet request
      * @param response servlet response
@@ -180,18 +181,24 @@ public class PrepareOperations {
      * @return the action mapping
      */
     public ActionMapping findActionMapping(HttpServletRequest request, 
HttpServletResponse response, boolean forceLookup) {
-        ActionMapping mapping = (ActionMapping) 
request.getAttribute(STRUTS_ACTION_MAPPING_KEY);
-        if (mapping == null || forceLookup) {
+        ActionMapping mapping = null;
+
+        Object mappingAttr = request.getAttribute(STRUTS_ACTION_MAPPING_KEY);
+        if (mappingAttr == null || forceLookup) {
             try {
                 mapping = 
dispatcher.getContainer().getInstance(ActionMapper.class).getMapping(request, 
dispatcher.getConfigurationManager());
                 if (mapping != null) {
                     request.setAttribute(STRUTS_ACTION_MAPPING_KEY, mapping);
+                } else {
+                    request.setAttribute(STRUTS_ACTION_MAPPING_KEY, 
NO_ACTION_MAPPING);
                 }
             } catch (Exception ex) {
                 if (dispatcher.isHandleException() || dispatcher.isDevMode()) {
                     dispatcher.sendError(request, response, 
HttpServletResponse.SC_INTERNAL_SERVER_ERROR, ex);
                 }
             }
+        } else if (!NO_ACTION_MAPPING.equals(mappingAttr)) {
+            mapping = (ActionMapping) mappingAttr;
         }
 
         return mapping;
diff --git 
a/core/src/main/java/org/apache/struts2/dispatcher/filter/StrutsExecuteFilter.java
 
b/core/src/main/java/org/apache/struts2/dispatcher/filter/StrutsExecuteFilter.java
index 30913f6bb..0e479c449 100644
--- 
a/core/src/main/java/org/apache/struts2/dispatcher/filter/StrutsExecuteFilter.java
+++ 
b/core/src/main/java/org/apache/struts2/dispatcher/filter/StrutsExecuteFilter.java
@@ -73,17 +73,10 @@ public class StrutsExecuteFilter implements StrutsStatics, 
Filter {
 
         ActionMapping mapping = prepare.findActionMapping(request, response);
 
-        //if recursion counter is > 1, it means we are in a "forward", in that 
case a mapping will still be
-        //in the request, if we handle it, it will lead to an infinite loop, 
see WW-3077
-        Integer recursionCounter = (Integer) 
request.getAttribute(PrepareOperations.CLEANUP_RECURSION_COUNTER);
-
-        if (mapping == null || recursionCounter > 1) {
-            boolean handled = execute.executeStaticResourceRequest(request, 
response);
-            if (!handled) {
-                chain.doFilter(request, response);
-            }
-        } else {
+        if (mapping != null) {
             execute.executeAction(request, response, mapping);
+        } else if (!execute.executeStaticResourceRequest(request, response)) {
+            chain.doFilter(request, response);
         }
     }
 
diff --git 
a/core/src/main/java/org/apache/struts2/dispatcher/filter/StrutsPrepareFilter.java
 
b/core/src/main/java/org/apache/struts2/dispatcher/filter/StrutsPrepareFilter.java
index 0332fa342..b35d6cb10 100644
--- 
a/core/src/main/java/org/apache/struts2/dispatcher/filter/StrutsPrepareFilter.java
+++ 
b/core/src/main/java/org/apache/struts2/dispatcher/filter/StrutsPrepareFilter.java
@@ -86,7 +86,7 @@ public class StrutsPrepareFilter implements StrutsStatics, 
Filter {
                 prepare.createActionContext(request, response);
                 prepare.assignDispatcherToThread();
                 request = prepare.wrapRequest(request);
-                prepare.findActionMapping(request, response);
+                prepare.findActionMapping(request, response, true);
             }
             chain.doFilter(request, response);
         } finally {

Reply via email to