Updated Branches: refs/heads/wicket-1.5.x 121f2e2a1 -> 3caf81368
WICKET-4891 handle composed context and filter paths, remove all prefix or none Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/3caf8136 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/3caf8136 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/3caf8136 Branch: refs/heads/wicket-1.5.x Commit: 3caf81368f4c74ff40554f5ade6d0116fa9c3fe1 Parents: 121f2e2 Author: svenmeier <[email protected]> Authored: Tue Nov 27 16:06:17 2012 +0100 Committer: svenmeier <[email protected]> Committed: Tue Nov 27 16:06:17 2012 +0100 ---------------------------------------------------------------------- .../wicket/request/cycle/UrlRendererTest.java | 49 +++++++++++++-- .../org/apache/wicket/request/UrlRenderer.java | 44 +++++-------- 2 files changed, 61 insertions(+), 32 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/3caf8136/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 b54b5df..6d2ecda 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 @@ -290,13 +290,27 @@ public class UrlRendererTest extends Assert } @Test + public void renderFullUrlAsRelativeToBaseUrlWithoutComposedContextAndFilterPaths() + { + Url baseUrl = Url.parse("a/b/c/d"); // base url without context path and filter path + Url encodedFullUrl = Url.parse("http://host:8080/context/path/filter/path/a/b;jsessionid=123456"); + + MockWebRequest request = new MockWebRequest(baseUrl); + request.setContextPath("context/path"); + request.setFilterPath("filter/path"); + UrlRenderer renderer = new UrlRenderer(request); + String encodedRelativeUrl = renderer.renderRelativeUrl(encodedFullUrl); + + assertEquals("../../b;jsessionid=123456", encodedRelativeUrl); + } + + @Test public void renderFullUrlAsRelativeToBaseUrlWithoutContextPath() { Url baseUrl = Url.parse("a/b/c/d"); // base url without context path and filter path Url encodedFullUrl = Url.parse("http://host:8080/filterPath/a/b;jsessionid=123456"); MockWebRequest request = new MockWebRequest(baseUrl); - request.setContextPath("contextPath"); request.setFilterPath("filterPath"); UrlRenderer renderer = new UrlRenderer(request); String encodedRelativeUrl = renderer.renderRelativeUrl(encodedFullUrl); @@ -305,6 +319,20 @@ public class UrlRendererTest extends Assert } @Test + public void renderFullUrlAsRelativeToBaseUrlWithoutComposedContextPath() + { + Url baseUrl = Url.parse("a/b/c/d"); // base url without context path and filter path + Url encodedFullUrl = Url.parse("http://host:8080/filter/path/a/b;jsessionid=123456"); + + MockWebRequest request = new MockWebRequest(baseUrl); + request.setFilterPath("filter/path"); + UrlRenderer renderer = new UrlRenderer(request); + String encodedRelativeUrl = renderer.renderRelativeUrl(encodedFullUrl); + + assertEquals("../../b;jsessionid=123456", encodedRelativeUrl); + } + + @Test public void renderFullUrlAsRelativeToBaseUrlWithoutFilterPath() { Url baseUrl = Url.parse("a/b/c/d"); // base url without context path and filter path @@ -312,7 +340,20 @@ public class UrlRendererTest extends Assert MockWebRequest request = new MockWebRequest(baseUrl); request.setContextPath("contextPath"); - request.setFilterPath("filterPath"); + UrlRenderer renderer = new UrlRenderer(request); + String encodedRelativeUrl = renderer.renderRelativeUrl(encodedFullUrl); + + assertEquals("../../b;jsessionid=123456", encodedRelativeUrl); + } + + @Test + public void renderFullUrlAsRelativeToBaseUrlWithoutComposedFilterPath() + { + Url baseUrl = Url.parse("a/b/c/d"); // base url without context path and filter path + Url encodedFullUrl = Url.parse("http://host:8080/context/path/a/b;jsessionid=123456"); + + MockWebRequest request = new MockWebRequest(baseUrl); + request.setContextPath("context/path"); UrlRenderer renderer = new UrlRenderer(request); String encodedRelativeUrl = renderer.renderRelativeUrl(encodedFullUrl); @@ -331,7 +372,6 @@ public class UrlRendererTest extends Assert MockWebRequest request = new MockWebRequest(baseUrl); request.setContextPath("contextPath"); - request.setFilterPath("filterPath"); UrlRenderer renderer = new UrlRenderer(request); String encodedRelativeUrl = renderer.renderRelativeUrl(encodedFullUrl); @@ -364,11 +404,10 @@ public class UrlRendererTest extends Assert // 'filterPath' here is a normal segment with the same value Url baseUrl = Url.parse("filterPath/a/b/c/d"); - // here 'contextPath' is the actual context path and should be ignored + // here 'filterPath' is the actual filter path and should be ignored Url encodedFullUrl = Url.parse("http://host:8080/filterPath/a/b;jsessionid=123456"); MockWebRequest request = new MockWebRequest(baseUrl); - request.setContextPath("contextPath"); request.setFilterPath("filterPath"); UrlRenderer renderer = new UrlRenderer(request); String encodedRelativeUrl = renderer.renderRelativeUrl(encodedFullUrl); http://git-wip-us.apache.org/repos/asf/wicket/blob/3caf8136/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 8fdb211..daa161d 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 @@ -272,46 +272,36 @@ public class UrlRenderer } /** - * Removes common prefixes like empty first segment, context path and filter path - * + * Removes common prefixes like empty first segment, context path and filter path. + * * @param request - * the current web request + * the current web request * @param segments - * the segments to clean + * the segments to clean */ private void removeCommonPrefixes(Request request, List<String> segments) { - if (segments.isEmpty()) + // try to remove context/filter path only if the Url starts with '/', + // i.e. has an empty segment in the beginning + if (segments.isEmpty() || "".equals(segments.get(0)) == false) { return; } - if ("".equals(segments.get(0))) - { - LOG.debug("Removing an empty first segment from '{}'", segments); - segments.remove(0); + Url commonPrefix = Url.parse(request.getContextPath() + request.getFilterPath()); - // try to remove context/filter path only if the Url starts with '/', - // i.e. has an empty segment in the beginning - String contextPath = request.getContextPath(); - if (contextPath != null && segments.isEmpty() == false) + for (int i = 0; i < commonPrefix.getSegments().size() && i < segments.size(); i++) + { + if (commonPrefix.getSegments().get(i).equals(segments.get(i)) == false) { - if (contextPath.equals(UrlUtils.normalizePath(segments.get(0)))) - { - LOG.debug("Removing the context path '{}' from '{}'", contextPath, segments); - segments.remove(0); - } + LOG.debug("Segments '{}' do not start with common prefix '{}'", segments, commonPrefix); + return; } + } - String filterPath = request.getFilterPath(); - if (filterPath != null && segments.isEmpty() == false) - { - if (filterPath.equals(UrlUtils.normalizePath(segments.get(0)))) - { - LOG.debug("Removing the filter path '{}' from '{}'", filterPath, segments); - segments.remove(0); - } - } + for (int i = 0; i < commonPrefix.getSegments().size(); i++) + { + segments.remove(0); } }
