You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2020/04/21 20:44:24 UTC
[wicket] branch wicket-7.x updated: WICKET-6764
RedirectToUrlException change the second question mark in URL from "?" to
"%3F"
This is an automated email from the ASF dual-hosted git repository.
mgrigorov pushed a commit to branch wicket-7.x
in repository https://gitbox.apache.org/repos/asf/wicket.git
The following commit(s) were added to refs/heads/wicket-7.x by this push:
new ae02f4b WICKET-6764 RedirectToUrlException change the second question mark in URL from "?" to "%3F"
ae02f4b is described below
commit ae02f4b625907f557e514fb73c8f01940a1cea1f
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
AuthorDate: Tue Apr 21 23:38:26 2020 +0300
WICKET-6764 RedirectToUrlException change the second question mark in URL from "?" to "%3F"
(cherry picked from commit 6c589d2bf9ea69d8ffaac647669c4cd35b1f2dd5)
(cherry picked from commit ccd5eb69b87e820e5d04b387fc565da20e3345f6)
---
.../http/handler/RedirectRequestHandler.java | 63 +++++++++++++++++-----
.../http/handler/RedirectRequestHandlerTest.java | 52 +++++++++++++-----
2 files changed, 90 insertions(+), 25 deletions(-)
diff --git a/wicket-request/src/main/java/org/apache/wicket/request/http/handler/RedirectRequestHandler.java b/wicket-request/src/main/java/org/apache/wicket/request/http/handler/RedirectRequestHandler.java
index 5331a8d..3387e3f 100644
--- a/wicket-request/src/main/java/org/apache/wicket/request/http/handler/RedirectRequestHandler.java
+++ b/wicket-request/src/main/java/org/apache/wicket/request/http/handler/RedirectRequestHandler.java
@@ -39,10 +39,29 @@ import org.apache.wicket.util.lang.Args;
*/
public class RedirectRequestHandler implements IRequestHandler
{
+ public enum Mode
+ {
+ /**
+ * Use {@link WebResponse#sendRedirect(String)}.
+ * It will call {@link WebResponse#encodeRedirectURL(CharSequence)} and may URL-encode some parts of the {@code location}
+ */
+ REDIRECT,
+ /**
+ * Use {@link WebResponse#setStatus(int)} + {@link WebResponse#setHeader(String, String)}.
+ * Sets the {@code location} as a value of {@code Location} response header as is, i.e. without url-encoding.
+ */
+ STATUS,
+ /**
+ * Decide dynamically depending on the value of {@code status} field
+ */
+ AUTO;
+ }
private final String redirectUrl;
private final int status;
+ private Mode mode = Mode.AUTO;
+
/**
* @param redirectUrl
* URL to redirect to.
@@ -86,12 +105,17 @@ public class RedirectRequestHandler implements IRequestHandler
return status;
}
- /** {@inheritDoc} */
public void detach(final IRequestCycle requestCycle)
{
}
- /** {@inheritDoc} */
+ public RedirectRequestHandler mode(Mode mode)
+ {
+ this.mode = mode != null ? mode : Mode.AUTO;
+ return this;
+ }
+
+ @Override
public void respond(final IRequestCycle requestCycle)
{
final String location;
@@ -113,22 +137,35 @@ public class RedirectRequestHandler implements IRequestHandler
WebResponse response = (WebResponse)requestCycle.getResponse();
- if (status == HttpServletResponse.SC_MOVED_TEMPORARILY)
+ if (mode == Mode.REDIRECT)
{
response.sendRedirect(location);
}
+ else if (mode == Mode.STATUS)
+ {
+ setStatus(response, requestCycle, location);
+ }
+ // Mode.AUTO
+ else if (status == HttpServletResponse.SC_MOVED_TEMPORARILY)
+ {
+ response.sendRedirect(location);
+ }
+ else
+ {
+ setStatus(response, requestCycle, location);
+ }
+ }
+
+ private void setStatus(final WebResponse response, final IRequestCycle requestCycle, final String location) {
+ response.setStatus(status);
+
+ if (((WebRequest)requestCycle.getRequest()).isAjax())
+ {
+ response.setHeader("Ajax-Location", location);
+ }
else
{
- response.setStatus(status);
-
- if (((WebRequest)requestCycle.getRequest()).isAjax())
- {
- response.setHeader("Ajax-Location", location);
- }
- else
- {
- response.setHeader("Location", location);
- }
+ response.setHeader("Location", location);
}
}
}
diff --git a/wicket-request/src/test/java/org/apache/wicket/request/http/handler/RedirectRequestHandlerTest.java b/wicket-request/src/test/java/org/apache/wicket/request/http/handler/RedirectRequestHandlerTest.java
index 8f1c9d8..5131036 100644
--- a/wicket-request/src/test/java/org/apache/wicket/request/http/handler/RedirectRequestHandlerTest.java
+++ b/wicket-request/src/test/java/org/apache/wicket/request/http/handler/RedirectRequestHandlerTest.java
@@ -17,6 +17,7 @@
package org.apache.wicket.request.http.handler;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import javax.servlet.http.HttpServletResponse;
@@ -26,7 +27,6 @@ import org.apache.wicket.request.http.WebRequest;
import org.apache.wicket.request.http.WebResponse;
import org.junit.Before;
import org.junit.Test;
-import org.mockito.Mockito;
/**
* RedirectRequestHandlerTest
@@ -46,19 +46,16 @@ public class RedirectRequestHandlerTest
when(requestCycle.getRequest()).thenReturn(webRequest);
}
- /**
- * permenanentlyMovedShouldSetLocationHeader()
- */
@Test
- public void permenanentlyMovedShouldSetLocationHeader()
+ public void permanentlyMovedShouldSetLocationHeader()
{
RedirectRequestHandler handler = new RedirectRequestHandler(REDIRECT_URL,
HttpServletResponse.SC_MOVED_PERMANENTLY);
handler.respond(requestCycle);
- Mockito.verify(webResponse).setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
- Mockito.verify(webResponse).setHeader("Location", REDIRECT_URL);
+ verify(webResponse).setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
+ verify(webResponse).setHeader("Location", REDIRECT_URL);
}
/**
@@ -77,7 +74,7 @@ public class RedirectRequestHandlerTest
handler.respond(requestCycle);
- Mockito.verify(webResponse).sendRedirect(REDIRECT_URL);
+ verify(webResponse).sendRedirect(REDIRECT_URL);
}
/**
@@ -91,8 +88,8 @@ public class RedirectRequestHandlerTest
handler.respond(requestCycle);
- Mockito.verify(webResponse).setStatus(HttpServletResponse.SC_SEE_OTHER);
- Mockito.verify(webResponse).setHeader("Location", REDIRECT_URL);
+ verify(webResponse).setStatus(HttpServletResponse.SC_SEE_OTHER);
+ verify(webResponse).setHeader("Location", REDIRECT_URL);
}
/**
@@ -108,7 +105,38 @@ public class RedirectRequestHandlerTest
handler.respond(requestCycle);
- Mockito.verify(webResponse).setStatus(HttpServletResponse.SC_SEE_OTHER);
- Mockito.verify(webResponse).setHeader("Ajax-Location", REDIRECT_URL);
+ verify(webResponse).setStatus(HttpServletResponse.SC_SEE_OTHER);
+ verify(webResponse).setHeader("Ajax-Location", REDIRECT_URL);
+ }
+
+ /**
+ * https://issues.apache.org/jira/browse/WICKET-6764
+ */
+ @Test
+ public void movedPermanentlyAndModeRedirect_shouldSendRedirect()
+ {
+ RedirectRequestHandler handler = new RedirectRequestHandler(REDIRECT_URL,
+ HttpServletResponse.SC_MOVED_PERMANENTLY);
+ handler.mode(RedirectRequestHandler.Mode.REDIRECT);
+
+ handler.respond(requestCycle);
+
+ verify(webResponse).sendRedirect(REDIRECT_URL);
+ }
+
+ /**
+ * https://issues.apache.org/jira/browse/WICKET-6764
+ */
+ @Test
+ public void movedTemporarilyAndModeStatus_shouldSetLocation()
+ {
+ RedirectRequestHandler handler = new RedirectRequestHandler(REDIRECT_URL,
+ HttpServletResponse.SC_MOVED_TEMPORARILY);
+ handler.mode(RedirectRequestHandler.Mode.STATUS);
+
+ handler.respond(requestCycle);
+
+ verify(webResponse).setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
+ verify(webResponse).setHeader("Location", REDIRECT_URL);
}
}