This is an automated email from the ASF dual-hosted git repository.
mgrigorov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/wicket.git
The following commit(s) were added to refs/heads/master by this push:
new d63af38 WICKET-6878 Rendering of relative Urls does not take into
account filterpath for absolute Urls
d63af38 is described below
commit d63af387f2750cb0e11ad58da870ca33ded85553
Author: Martin Tzvetanov Grigorov <[email protected]>
AuthorDate: Tue Apr 20 14:54:20 2021 +0300
WICKET-6878 Rendering of relative Urls does not take into account
filterpath for absolute Urls
Urls created by Url#parse(fullUrlAsString) should be rendered as full url
by UrlRenderer#rendered(url), no matter whether it has the same
scheme/host/port as the base url.
Wicket usually works with relative urls, but if the user uses full url for
some reason then respect this and render it as full.
At the moment UrlRenderer#renderRelativeUrl(url) will render it as relative
to the current base url ignoring the scheme/host/port completely. This might be
correct or not but too at the moment there is no need to change this behavior.
(cherry picked from commit 50eb3c78cddd1918f4db2bd3bd7d2a67406c51ab)
---
.../org/apache/wicket/mock/MockWebRequest.java | 6 +--
.../apache/wicket/util/tester/WicketTester.java | 31 +++++------
.../wicket/request/cycle/UrlRendererTest.java | 60 ++++++++++++++++++++++
.../main/java/org/apache/wicket/request/Url.java | 21 +++++++-
.../org/apache/wicket/request/UrlRenderer.java | 4 ++
5 files changed, 102 insertions(+), 20 deletions(-)
diff --git
a/wicket-core/src/main/java/org/apache/wicket/mock/MockWebRequest.java
b/wicket-core/src/main/java/org/apache/wicket/mock/MockWebRequest.java
index b84758a..921f841 100644
--- a/wicket-core/src/main/java/org/apache/wicket/mock/MockWebRequest.java
+++ b/wicket-core/src/main/java/org/apache/wicket/mock/MockWebRequest.java
@@ -31,7 +31,6 @@ import javax.servlet.http.Cookie;
import org.apache.wicket.WicketRuntimeException;
import org.apache.wicket.request.Url;
-import org.apache.wicket.request.Url.QueryParameter;
import org.apache.wicket.request.UrlUtils;
import org.apache.wicket.request.http.WebRequest;
@@ -43,7 +42,7 @@ import org.apache.wicket.request.http.WebRequest;
public class MockWebRequest extends WebRequest
{
private Url url;
- private List<Cookie> cookies = new ArrayList<Cookie>();
+ private List<Cookie> cookies = new ArrayList<>();
private Map<String, List<Object>> headers = new HashMap<String,
List<Object>>();
private MockRequestParameters postRequestParameters = new
MockRequestParameters();
private Locale locale = Locale.getDefault();
@@ -283,7 +282,8 @@ public class MockWebRequest extends WebRequest
@Override
public Url getClientUrl()
{
- Url baseUrl = new Url(url.getSegments(),
Collections.<QueryParameter> emptyList());
+ Url baseUrl = new Url(url);
+ baseUrl.getQueryParameters().clear();
baseUrl.setContextRelative(url.isContextRelative());
return baseUrl;
}
diff --git
a/wicket-core/src/main/java/org/apache/wicket/util/tester/WicketTester.java
b/wicket-core/src/main/java/org/apache/wicket/util/tester/WicketTester.java
index 1addc55..b573a3a 100644
--- a/wicket-core/src/main/java/org/apache/wicket/util/tester/WicketTester.java
+++ b/wicket-core/src/main/java/org/apache/wicket/util/tester/WicketTester.java
@@ -142,22 +142,24 @@ import org.slf4j.LoggerFactory;
* {@link Component#getPageRelativePath()}. Since each Component has an
ID/name, any Component can
* also be referenced by its ID {@link MarkupContainer#get(String)}. And since
MarkupContainer's and
* its subclasses are containers which allow to add Components (in sync with
the markup hierarchy),
- * you may not only access direct childs but also subchilds like
get("myPanel:myForm:myNameField")
+ * you may not only access direct children but also grandchildren like
get("myPanel:myForm:myNameField")
* separating each ID with a ':'.
*
- * Cookie handling:
- *
- * There are some expectations about wicket tester cookie handling which
should match as best as it
- * can be with a real client server request response cycle: - all valid
cookies set before a request
- * is made (tester.getRequest().addCookie()) should appear in the page request
- all cookies set in
- * the response should appear in the last response (tester.getLastResponse())
after the request is
- * made (expired cookies and others) - all cookies set in the response should
appear even after a
- * redirect response is made until the final response
(tester.getLastResponse()) is written to the
- * client (wicket tester) - all valid cookies (maxAge!=0) from the last
response should be added to
- * the next request cookies (tester.getRequest().getCookies())
- *
- *
- * TODO General: Example usage of FormTester
+ * <h2>Cookie handling</h2>
+ * <p>
+ * There are some expectations about wicket tester cookie handling which
should match as best as
+ * it can be with a real client server request response cycle:
+ * <ul>
+ * <li> all valid cookies set before a request is made
(tester.getRequest().addCookie()) should
+ * appear in the page request</li>
+ * <li> all cookies set in the response should appear in the last response
(tester.getLastResponse())
+ * after the request is made (expired cookies and others)</li>
+ * <li> all cookies set in the response should appear even after a redirect
response is made
+ * until the final response (tester.getLastResponse()) is written to the
client (wicket tester)</li>
+ * <li> all valid cookies (maxAge!=0) from the last response should be added
to
+ * the next request cookies (tester.getRequest().getCookies())</li>
+ * </ul>
+ * </p>
*
* @author Ingram Chen
* @author Juergen Donnerstag
@@ -166,7 +168,6 @@ import org.slf4j.LoggerFactory;
*/
public class WicketTester extends BaseWicketTester
{
- /** log. */
private static final Logger log =
LoggerFactory.getLogger(WicketTester.class);
/**
diff --git
a/wicket-core/src/test/java/org/apache/wicket/request/cycle/UrlRendererTest.java
b/wicket-core/src/test/java/org/apache/wicket/request/cycle/UrlRendererTest.java
index d1c6809..b7df849 100644
---
a/wicket-core/src/test/java/org/apache/wicket/request/cycle/UrlRendererTest.java
+++
b/wicket-core/src/test/java/org/apache/wicket/request/cycle/UrlRendererTest.java
@@ -733,4 +733,64 @@ class UrlRendererTest
String renderedUrl = renderer.renderUrl(Url.parse("abc..."));
assertEquals("../abc...", renderedUrl);
}
+
+ /**
+ * https://issues.apache.org/jira/browse/WICKET-6878
+ *
+ * When passing a full url to {@link UrlRenderer#renderUrl(Url)}
+ * always render it as full, i.e. with scheme, host and port (if
available)
+ */
+ @Test
+ public void whenRenderingFullUrl_thenRenderItFull()
+ {
+ UrlRenderer renderer = new UrlRenderer(new
MockWebRequest(Url.parse("http://localhost/a/b")));
+
+ String renderedUrl =
renderer.renderUrl(Url.parse("http://localhost/c/d"));
+ assertEquals("http://localhost/c/d", renderedUrl);
+ }
+
+ /**
+ * https://issues.apache.org/jira/browse/WICKET-6878
+ *
+ * When passing a full url to {@link UrlRenderer#renderUrl(Url)}
+ * always render it as full, i.e. with scheme, host and port (if
available)
+ */
+ @Test
+ public void whenRenderingFullUrlWithDifferentScheme_thenRenderItFull()
+ {
+ UrlRenderer renderer = new UrlRenderer(new
MockWebRequest(Url.parse("http://localhost/a/b")));
+
+ String renderedUrl =
renderer.renderUrl(Url.parse("https://localhost/c/d"));
+ assertEquals("https://localhost/c/d", renderedUrl);
+ }
+
+ /**
+ * https://issues.apache.org/jira/browse/WICKET-6878
+ *
+ * When passing a full url to {@link UrlRenderer#renderUrl(Url)}
+ * always render it as full, i.e. with scheme, host and port (if
available)
+ */
+ @Test
+ public void whenRenderingFullUrlWithDifferentHost_thenRenderItFull()
+ {
+ UrlRenderer renderer = new UrlRenderer(new
MockWebRequest(Url.parse("http://localhost/a/b")));
+
+ String renderedUrl =
renderer.renderUrl(Url.parse("http://another.host/c/d"));
+ assertEquals("http://another.host/c/d", renderedUrl);
+ }
+
+ /**
+ * https://issues.apache.org/jira/browse/WICKET-6878
+ *
+ * When passing a full url to {@link UrlRenderer#renderUrl(Url)}
+ * always render it as full, i.e. with scheme, host and port (if
available)
+ */
+ @Test
+ public void whenRenderingFullUrlWithDifferentPort_thenRenderItFull()
+ {
+ UrlRenderer renderer = new UrlRenderer(new
MockWebRequest(Url.parse("http://localhost/a/b")));
+
+ String renderedUrl =
renderer.renderUrl(Url.parse("http://localhost:8080/c/d"));
+ assertEquals("http://localhost:8080/c/d", renderedUrl);
+ }
}
diff --git a/wicket-request/src/main/java/org/apache/wicket/request/Url.java
b/wicket-request/src/main/java/org/apache/wicket/request/Url.java
index a056a22..8ccc8e8 100755
--- a/wicket-request/src/main/java/org/apache/wicket/request/Url.java
+++ b/wicket-request/src/main/java/org/apache/wicket/request/Url.java
@@ -95,11 +95,25 @@ public class Url implements Serializable
private boolean contextRelative;
/**
+ * A flag indicating that the Url is created from a full url, i.e.
+ * with scheme, host and optional port.
+ * Wicket usually works with relative urls. If a client wants to parse
+ * a full url then most probably it also expects this url to be rendered
+ * as full by {@link UrlRenderer#renderUrl(Url)}
+ */
+ private boolean shouldRenderAsFull;
+
+ public boolean shouldRenderAsFull()
+ {
+ return shouldRenderAsFull;
+ }
+
+ /**
* Modes with which urls can be stringized
*
* @author igor
*/
- public static enum StringMode {
+ public enum StringMode {
/** local urls are rendered without the host name */
LOCAL,
/**
@@ -147,6 +161,7 @@ public class Url implements Serializable
parameters = new ArrayList<>(url.parameters);
charsetName = url.charsetName;
_charset = url._charset;
+ shouldRenderAsFull = url.shouldRenderAsFull;
}
/**
@@ -168,7 +183,7 @@ public class Url implements Serializable
*/
public Url(final List<String> segments, final Charset charset)
{
- this(segments, Collections.<QueryParameter> emptyList(),
charset);
+ this(segments, Collections.emptyList(), charset);
}
/**
@@ -272,6 +287,8 @@ public class Url implements Serializable
if (isFull && isFullHint)
{
+ result.shouldRenderAsFull = true;
+
if (protocolLess == false)
{
result.protocol = absoluteUrl.substring(0,
protocolAt).toLowerCase(Locale.US);
diff --git
a/wicket-request/src/main/java/org/apache/wicket/request/UrlRenderer.java
b/wicket-request/src/main/java/org/apache/wicket/request/UrlRenderer.java
index c02996a..4d0421f 100644
--- a/wicket-request/src/main/java/org/apache/wicket/request/UrlRenderer.java
+++ b/wicket-request/src/main/java/org/apache/wicket/request/UrlRenderer.java
@@ -361,6 +361,10 @@ public class UrlRenderer
*/
protected boolean shouldRenderAsFull(final Url url)
{
+ if (url.shouldRenderAsFull()) {
+ return true;
+ }
+
Url clientUrl = request.getClientUrl();
if (!Strings.isEmpty(url.getProtocol()) &&