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);
 	}
 }