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