diff --git a/core/src/main/java/org/apache/struts2/dispatcher/ServletRedirectResult.java b/core/src/main/java/org/apache/struts2/dispatcher/ServletRedirectResult.java index a843a5bb9..de37f0a7c 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/ServletRedirectResult.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/ServletRedirectResult.java @@ -250,11 +250,13 @@ public class ServletRedirectResult extends StrutsResultSupport implements Reflec } - private static boolean isPathUrl(String url) { + private boolean isPathUrl(String url) { // filter out "http:", "https:", "mailto:", "file:", "ftp:" - // since the only valid places for : in URL's is before the path specification - // either before the port, or after the protocol - return (url.indexOf(':') == -1); + return !url.startsWith("http:") + && !url.startsWith("https:") + && !url.startsWith("mailto:") + && !url.startsWith("file:") + && !url.startsWith("ftp:"); } /** diff --git a/core/src/test/java/org/apache/struts2/dispatcher/ServletRedirectResultTest.java b/core/src/test/java/org/apache/struts2/dispatcher/ServletRedirectResultTest.java index 7d8606353..6be315bf3 100644 --- a/core/src/test/java/org/apache/struts2/dispatcher/ServletRedirectResultTest.java +++ b/core/src/test/java/org/apache/struts2/dispatcher/ServletRedirectResultTest.java @@ -79,6 +79,20 @@ public class ServletRedirectResultTest extends StrutsTestCase implements StrutsS } } + public void testFullUrlRedirect() { + view.setLocation("http://localhost/bar/foo.jsp"); + responseMock.expect("sendRedirect", C.args(C.eq("http://localhost/bar/foo.jsp"))); + + try { + view.execute(ai); + requestMock.verify(); + responseMock.verify(); + } catch (Exception e) { + e.printStackTrace(); + fail(); + } + } + public void testAbsoluteRedirect303() { view.setLocation("/bar/foo.jsp"); view.setStatusCode(303);