You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by mr...@apache.org on 2007/11/03 15:22:36 UTC

svn commit: r591627 - in /struts/struts2/trunk/core/src: main/java/org/apache/struts2/dispatcher/ServletRedirectResult.java test/java/org/apache/struts2/dispatcher/ServletRedirectResultTest.java

Author: mrdon
Date: Sat Nov  3 07:22:36 2007
New Revision: 591627

URL: http://svn.apache.org/viewvc?rev=591627&view=rev
Log:
Adding support for different redirect result codes
WW-2289

Modified:
    struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletRedirectResult.java
    struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/ServletRedirectResultTest.java

Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletRedirectResult.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletRedirectResult.java?rev=591627&r1=591626&r2=591627&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletRedirectResult.java (original)
+++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletRedirectResult.java Sat Nov  3 07:22:36 2007
@@ -22,6 +22,7 @@
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import static javax.servlet.http.HttpServletResponse.*;
 
 import org.apache.struts2.ServletActionContext;
 import org.apache.struts2.dispatcher.mapper.ActionMapper;
@@ -33,6 +34,8 @@
 import com.opensymphony.xwork2.util.logging.Logger;
 import com.opensymphony.xwork2.util.logging.LoggerFactory;
 
+import java.io.IOException;
+
 
 /**
  * <!-- START SNIPPET: description -->
@@ -87,6 +90,8 @@
 
     protected ActionMapper actionMapper;
 
+    protected int statusCode = SC_FOUND;
+
     public ServletRedirectResult() {
         super();
     }
@@ -100,6 +105,10 @@
         this.actionMapper = mapper;
     }
 
+    public void setStatusCode(int code) {
+        this.statusCode = code;
+    }
+
     /**
      * Sets whether or not to prepend the servlet context path to the redirected URL.
      *
@@ -150,7 +159,27 @@
             LOG.debug("Redirecting to finalLocation " + finalLocation);
         }
 
-        response.sendRedirect(finalLocation);
+        sendRedirect(response, finalLocation);
+    }
+
+    /**
+     * Sends the redirection.  Can be overridden to customize how the redirect is handled (i.e. to use a different
+     * status code)
+     *
+     * @param response The response
+     * @param finalLocation The location URI
+     * @throws IOException
+     */
+    protected void sendRedirect(HttpServletResponse response, String finalLocation) throws IOException {
+        if (SC_FOUND == statusCode) {
+            response.sendRedirect(finalLocation);
+        } else {
+            response.setStatus(statusCode);
+            response.setHeader("Location", finalLocation);
+            response.getWriter().write(finalLocation);
+            response.getWriter().close();
+        }
+
     }
 
     private static boolean isPathUrl(String url) {

Modified: struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/ServletRedirectResultTest.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/ServletRedirectResultTest.java?rev=591627&r1=591626&r2=591627&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/ServletRedirectResultTest.java (original)
+++ struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/ServletRedirectResultTest.java Sat Nov  3 07:22:36 2007
@@ -21,9 +21,12 @@
 package org.apache.struts2.dispatcher;
 
 import java.util.HashMap;
+import java.io.StringWriter;
+import java.io.PrintWriter;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import static javax.servlet.http.HttpServletResponse.*;
 
 import ognl.Ognl;
 
@@ -66,6 +69,26 @@
             e.printStackTrace();
             fail();
         }
+    }
+
+    public void testAbsoluteRedirect303() {
+        view.setLocation("/bar/foo.jsp");
+        view.setStatusCode(303);
+        responseMock.expectAndReturn("encodeRedirectURL", "/context/bar/foo.jsp", "/context/bar/foo.jsp");
+        responseMock.expect("setStatus", C.args(C.eq(SC_SEE_OTHER)));
+        responseMock.expect("setHeader", C.args(C.eq("Location"), C.eq("/context/bar/foo.jsp")));
+        StringWriter writer = new StringWriter();
+        responseMock.matchAndReturn("getWriter", new PrintWriter(writer));
+
+        try {
+            view.execute(ai);
+            requestMock.verify();
+            responseMock.verify();
+        } catch (Exception e) {
+            e.printStackTrace();
+            fail();
+        }
+        assertEquals("/context/bar/foo.jsp", writer.toString());
     }
 
     public void testPrependServletContextFalse() {