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() {