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

Reply via email to