Repository: wicket Updated Branches: refs/heads/master d8142a7e2 -> dfa32cd15
WICKET-6473 Flagging context relative URLs - flagging context relative URLs used in the ServletWebRequest so they don't lose their empty segments information when being processed inside UrlRenderer - preserving the base URL segments by sending a copy of it to UrlRenderer#removeCommonPrefixes - preserving empty segments of problematic and forward URIs by hinting the URL parser they are not full Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/dfa32cd1 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/dfa32cd1 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/dfa32cd1 Branch: refs/heads/master Commit: dfa32cd151fec1e85ed65a83a363ef33144a652e Parents: d8142a7 Author: Pedro Santos <[email protected]> Authored: Wed Jan 17 02:09:51 2018 -0200 Committer: Pedro Santos <[email protected]> Committed: Tue Feb 20 22:10:27 2018 -0300 ---------------------------------------------------------------------- .../org/apache/wicket/mock/MockWebRequest.java | 4 ++- .../http/servlet/ServletWebRequest.java | 5 +-- .../wicket/request/cycle/UrlRendererTest.java | 18 +++++++++++ .../java/org/apache/wicket/request/Url.java | 34 ++++++++++++++++++-- .../org/apache/wicket/request/UrlRenderer.java | 8 +++-- .../java/org/apache/wicket/request/UrlTest.java | 18 +++++++++++ 6 files changed, 80 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/dfa32cd1/wicket-core/src/main/java/org/apache/wicket/mock/MockWebRequest.java ---------------------------------------------------------------------- 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 61e95c9..ffbbd6f 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 @@ -281,7 +281,9 @@ public class MockWebRequest extends WebRequest @Override public Url getClientUrl() { - return new Url(url.getSegments(), Collections.<QueryParameter> emptyList()); + Url baseUrl = new Url(url.getSegments(), Collections.<QueryParameter> emptyList()); + baseUrl.setContextRelative(url.isContextRelative()); + return baseUrl; } @Override http://git-wip-us.apache.org/repos/asf/wicket/blob/dfa32cd1/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java b/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java index c668cdf..45b0544 100644 --- a/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java +++ b/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java @@ -132,13 +132,13 @@ public class ServletWebRequest extends WebRequest { if (errorAttributes != null && !Strings.isEmpty(errorAttributes.getRequestUri())) { - String problematicURI = Url.parse(errorAttributes.getRequestUri(), getCharset()) + String problematicURI = Url.parse(errorAttributes.getRequestUri(), getCharset(), false) .toString(); return getContextRelativeUrl(problematicURI, filterPrefix); } else if (forwardAttributes != null && !Strings.isEmpty(forwardAttributes.getRequestUri())) { - String forwardURI = Url.parse(forwardAttributes.getRequestUri(), getCharset()) + String forwardURI = Url.parse(forwardAttributes.getRequestUri(), getCharset(), false) .toString(); return getContextRelativeUrl(forwardURI, filterPrefix); } @@ -170,6 +170,7 @@ public class ServletWebRequest extends WebRequest url.setPort(httpServletRequest.getServerPort()); url.setHost(httpServletRequest.getServerName()); url.setProtocol(httpServletRequest.getScheme()); + url.setContextRelative(true); return url; } http://git-wip-us.apache.org/repos/asf/wicket/blob/dfa32cd1/wicket-core/src/test/java/org/apache/wicket/request/cycle/UrlRendererTest.java ---------------------------------------------------------------------- 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 b294b4f..a64ae61 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 @@ -16,6 +16,9 @@ */ package org.apache.wicket.request.cycle; +import static java.util.Arrays.asList; +import static org.hamcrest.CoreMatchers.is; + import java.util.Arrays; import org.apache.wicket.mock.MockWebRequest; @@ -29,6 +32,7 @@ import org.junit.Test; */ public class UrlRendererTest extends Assert { + /** * */ @@ -188,6 +192,20 @@ public class UrlRendererTest extends Assert r1.renderRelativeUrl(Url.parse("http://localhost:8080/;jsessionid=1p87c5424zjuvd57kljcu2bwa?0-1.IBehaviorListener.1-component"))); } + @Test + public void rendersRelativeUrl() + { + Url contextRelativeUrl = new Url(); + contextRelativeUrl.setProtocol("http"); + contextRelativeUrl.setHost("localshot"); + contextRelativeUrl.setPort(8080); + contextRelativeUrl.setContextRelative(true); + contextRelativeUrl.getSegments().addAll(asList("", "")); + + UrlRenderer r1 = new UrlRenderer(new MockWebRequest(contextRelativeUrl)); + assertThat(r1.renderRelativeUrl(Url.parse("foo")), is("../foo")); + } + /** * WICKET-4935 prevent another double slash */ http://git-wip-us.apache.org/repos/asf/wicket/blob/dfa32cd1/wicket-request/src/main/java/org/apache/wicket/request/Url.java ---------------------------------------------------------------------- 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 4a078df..e9d4e71 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 @@ -88,6 +88,14 @@ public class Url implements Serializable private String fragment; /** + * Flags the URL as relative to the application context. It is a special type of URL, used + * internally to hold the client data: protocol + host + port + relative segments + * + * Unlike absolute URLs, a context relative one has no context or filter mapping segments + */ + private boolean contextRelative; + + /** * Modes with which urls can be stringized * * @author igor @@ -489,7 +497,7 @@ public class Url implements Serializable */ public boolean isContextAbsolute() { - return !isFull() && !getSegments().isEmpty() && Strings.isEmpty(getSegments().get(0)); + return !contextRelative && !isFull() && !getSegments().isEmpty() && Strings.isEmpty(getSegments().get(0)); } /** @@ -512,7 +520,7 @@ public class Url implements Serializable */ public boolean isFull() { - return getHost() != null; + return !contextRelative && getHost() != null; } /** @@ -1105,6 +1113,28 @@ public class Url implements Serializable } /** + * + * Flags the URL as relative to the application context. + * + * @param contextRelative + */ + public void setContextRelative(boolean contextRelative) + { + this.contextRelative = contextRelative; + } + + /** + * Tests if the URL is relative to the application context. If so, it holds all the information + * an absolute URL would have, minus the context and filter mapping segments + * + * @return contextRelative + */ + public boolean isContextRelative() + { + return contextRelative; + } + + /** * Gets the port of this url * * @return port or {@code null} if none has been set http://git-wip-us.apache.org/repos/asf/wicket/blob/dfa32cd1/wicket-request/src/main/java/org/apache/wicket/request/UrlRenderer.java ---------------------------------------------------------------------- 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 a07896b..f4d8720 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 @@ -239,10 +239,14 @@ public class UrlRenderer return renderer.renderRelativeUrl(url, getBaseUrl()); } - List<String> baseUrlSegments = getBaseUrl().getSegments(); + List<String> baseUrlSegments = new ArrayList<>(getBaseUrl().getSegments()); List<String> urlSegments = new ArrayList<>(url.getSegments()); - removeCommonPrefixes(request, baseUrlSegments); + if (!getBaseUrl().isContextRelative()) + { + // so we remove any possible filter/context segments + removeCommonPrefixes(request, baseUrlSegments); + } removeCommonPrefixes(request, urlSegments); List<String> newSegments = new ArrayList<>(); http://git-wip-us.apache.org/repos/asf/wicket/blob/dfa32cd1/wicket-request/src/test/java/org/apache/wicket/request/UrlTest.java ---------------------------------------------------------------------- diff --git a/wicket-request/src/test/java/org/apache/wicket/request/UrlTest.java b/wicket-request/src/test/java/org/apache/wicket/request/UrlTest.java index b2ef9a5..f5ab12c 100644 --- a/wicket-request/src/test/java/org/apache/wicket/request/UrlTest.java +++ b/wicket-request/src/test/java/org/apache/wicket/request/UrlTest.java @@ -905,6 +905,24 @@ public class UrlTest } @Test + public void contextRelativeIsntReadAsContextAbsolute() throws Exception + { + Url url = Url.parse("/segment"); + url.setContextRelative(true); + assertThat(url.isContextRelative(), is(true)); + assertThat(url.isContextAbsolute(), is(false)); + } + + @Test + public void contextRelativeIsntReadAsFull() throws Exception + { + Url url = Url.parse("http://www.example.com/segment"); + url.setContextRelative(true); + assertThat(url.isContextRelative(), is(true)); + assertThat(url.isFull(), is(false)); + } + + @Test public void isContextAbsolute() { Url url = Url.parse("");
