WICKET-5065 Improve UrlRenderer to be able to render urls without scheme and/or host
Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/9723ac36 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/9723ac36 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/9723ac36 Branch: refs/heads/master Commit: 9723ac3698bf37c7f44659d27f8d1c8ae1389730 Parents: ce0f1e9 Author: Martin Tzvetanov Grigorov <[email protected]> Authored: Thu Feb 28 16:14:52 2013 +0200 Committer: Martin Tzvetanov Grigorov <[email protected]> Committed: Thu Feb 28 16:14:52 2013 +0200 ---------------------------------------------------------------------- .../request/cycle/RequestCycleUrlForTest.java | 19 +++--- .../wicket/request/cycle/UrlRendererTest.java | 50 +++++++++++++++ .../org/apache/wicket/request/UrlRenderer.java | 24 +++++-- 3 files changed, 79 insertions(+), 14 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/9723ac36/wicket-core/src/test/java/org/apache/wicket/request/cycle/RequestCycleUrlForTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/request/cycle/RequestCycleUrlForTest.java b/wicket-core/src/test/java/org/apache/wicket/request/cycle/RequestCycleUrlForTest.java index 9ad8a99..2ec1c7c 100644 --- a/wicket-core/src/test/java/org/apache/wicket/request/cycle/RequestCycleUrlForTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/request/cycle/RequestCycleUrlForTest.java @@ -49,9 +49,9 @@ import org.junit.Test; public class RequestCycleUrlForTest extends Assert { private static final String JSESSIONID = ";jsessionid=1234567890"; - private static final String BOOKMARKABLE_PAGE_URL = "/bookmarkablePage"; - private static final String RES_REF_URL = "/resRef"; - private static final String RESOURCE_URL = "/res"; + private static final String BOOKMARKABLE_PAGE_URL = "bookmarkablePage"; + private static final String RES_REF_URL = "resRef"; + private static final String RESOURCE_URL = "res"; RequestCycle requestCycle; @@ -59,6 +59,9 @@ public class RequestCycleUrlForTest extends Assert public void before() { Request request = mock(Request.class); + Url baseUrl = Url.parse(""); + when(request.getClientUrl()).thenReturn(baseUrl); + Response response = new StringResponse() { @Override public String encodeURL(CharSequence url) @@ -81,7 +84,7 @@ public class RequestCycleUrlForTest extends Assert RequestCycleContext context = new RequestCycleContext(request, response, mapper, exceptionMapper); requestCycle = new RequestCycle(context); - requestCycle.getUrlRenderer().setBaseUrl(Url.parse("http://dummy-host")); + requestCycle.getUrlRenderer().setBaseUrl(baseUrl); } /** @@ -115,7 +118,7 @@ public class RequestCycleUrlForTest extends Assert }; ResourceReferenceRequestHandler handler = new ResourceReferenceRequestHandler(reference); CharSequence url = requestCycle.urlFor(handler); - assertEquals('.'+RES_REF_URL, url); + assertEquals("./"+RES_REF_URL, url); } /** @@ -137,7 +140,7 @@ public class RequestCycleUrlForTest extends Assert }; ResourceReferenceRequestHandler handler = new ResourceReferenceRequestHandler(reference); CharSequence url = requestCycle.urlFor(handler); - assertEquals('.'+RES_REF_URL+JSESSIONID, url); + assertEquals("./"+RES_REF_URL+JSESSIONID, url); } /** @@ -151,7 +154,7 @@ public class RequestCycleUrlForTest extends Assert IStaticCacheableResource resource = mock(IStaticCacheableResource.class); ResourceRequestHandler handler = new ResourceRequestHandler(resource, new PageParameters()); CharSequence url = requestCycle.urlFor(handler); - assertEquals('.'+RESOURCE_URL, url); + assertEquals("./"+RESOURCE_URL, url); } /** @@ -165,7 +168,7 @@ public class RequestCycleUrlForTest extends Assert ByteArrayResource resource = new ByteArrayResource(null, new byte[] {1, 2}, "test.bin"); ResourceRequestHandler handler = new ResourceRequestHandler(resource, new PageParameters()); CharSequence url = requestCycle.urlFor(handler); - assertEquals('.'+RESOURCE_URL + JSESSIONID, url); + assertEquals("./"+RESOURCE_URL + JSESSIONID, url); } /** http://git-wip-us.apache.org/repos/asf/wicket/blob/9723ac36/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 a11e84a..e47bba1 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 @@ -467,4 +467,54 @@ public class UrlRendererTest extends Assert assertEquals("../../../../a/b;jsessionid=123456", encodedRelativeUrl); } + /** + * https://issues.apache.org/jira/browse/WICKET-5065 + */ + @Test + public void renderAbsoluteWithoutHost() + { + Url baseUrl = Url.parse("a/b"); + + MockWebRequest request = new MockWebRequest(baseUrl); + UrlRenderer renderer = new UrlRenderer(request); + + Url absoluteUrl = Url.parse("/c/d"); + String encodedRelativeUrl = renderer.renderUrl(absoluteUrl); + + assertEquals("/c/d", encodedRelativeUrl); + } + + /** + * https://issues.apache.org/jira/browse/WICKET-5065 + */ + @Test + public void renderAbsoluteWithoutScheme() + { + Url baseUrl = Url.parse("a/b"); + + MockWebRequest request = new MockWebRequest(baseUrl); + UrlRenderer renderer = new UrlRenderer(request); + + Url absoluteUrl = Url.parse("//host/c/d"); + String encodedRelativeUrl = renderer.renderUrl(absoluteUrl); + + assertEquals("//host/c/d", encodedRelativeUrl); + } + + /** + * https://issues.apache.org/jira/browse/WICKET-5065 + */ + @Test + public void renderAbsoluteWithoutSchemeWithPort() + { + Url baseUrl = Url.parse("a/b"); + + MockWebRequest request = new MockWebRequest(baseUrl); + UrlRenderer renderer = new UrlRenderer(request); + + Url absoluteUrl = Url.parse("//host:1234/c/d"); + String encodedRelativeUrl = renderer.renderUrl(absoluteUrl); + + assertEquals("//host:1234/c/d", encodedRelativeUrl); + } } http://git-wip-us.apache.org/repos/asf/wicket/blob/9723ac36/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 c4005cc..b2f7f13 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 @@ -150,14 +150,22 @@ public class UrlRenderer } StringBuilder render = new StringBuilder(); - render.append(protocol); - render.append("://"); - render.append(host); - - if ((port != null) && !port.equals(PROTO_TO_PORT.get(protocol))) + if (Strings.isEmpty(protocol) == false) { + render.append(protocol); render.append(':'); - render.append(port); + } + + if (Strings.isEmpty(host) == false) + { + render.append("//"); + render.append(host); + + if ((port != null) && !port.equals(PROTO_TO_PORT.get(protocol))) + { + render.append(':'); + render.append(port); + } } if (url.isAbsolute() == false) @@ -355,6 +363,10 @@ public class UrlRenderer { return true; } + if (url.isAbsolute()) { + // do not relativize urls like "/a/b" + return true; + } return false; }
