WICKET-5345 Url.canonical() breaks when there are two consecutive "parent" 
segments followed by a normal segment


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/3c4db496
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/3c4db496
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/3c4db496

Branch: refs/heads/wicket-6.x
Commit: 3c4db496af86e972b2cfc2ed20a6fef25539afb6
Parents: bcce5f2
Author: Martin Tzvetanov Grigorov <[email protected]>
Authored: Mon Sep 16 11:25:30 2013 +0300
Committer: Martin Tzvetanov Grigorov <[email protected]>
Committed: Mon Sep 16 11:25:30 2013 +0300

----------------------------------------------------------------------
 .../main/java/org/apache/wicket/request/Url.java    | 16 ++++++++++------
 .../java/org/apache/wicket/request/UrlTest.java     |  6 +++++-
 2 files changed, 15 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/3c4db496/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 c285c51..e32a2dc 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
@@ -1216,17 +1216,21 @@ public class Url implements Serializable
                        // drop '.' from path
                        if (".".equals(segment))
                        {
-                               continue;
+                               // skip
+                       }
+                       else if ("..".equals(segment) && url.segments.isEmpty() 
== false)
+                       {
+                               url.segments.remove(url.segments.size() - 1);
                        }
-
                        // skip segment if following segment is a '..'
-                       if ((i + 1) < segments.size() && 
"..".equals(segments.get(i + 1)))
+                       else if ((i + 1) < segments.size() && 
"..".equals(segments.get(i + 1)))
                        {
                                i++;
-                               continue;
                        }
-
-                       url.segments.add(segment);
+                       else
+                       {
+                               url.segments.add(segment);
+                       }
                }
                return url;
        }

http://git-wip-us.apache.org/repos/asf/wicket/blob/3c4db496/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 e2d4018..5140b6c 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
@@ -798,7 +798,11 @@ public class UrlTest extends Assert
                assertEquals("a///", Url.parse("a///").canonical().getPath());
                assertEquals("a//b/c", 
Url.parse("a//b/c").canonical().getPath());
                assertEquals("foo/test", 
Url.parse("foo/bar/../baz/../test").canonical().getPath());
-//             assertEquals("a/d", 
Url.parse("a/b/c/../../d").canonical().getPath());
+               assertEquals("a/d", 
Url.parse("a/b/c/../../d").canonical().getPath());
+               assertEquals("a/d", 
Url.parse("../../a/b/../c/../d").canonical().getPath());
+               assertEquals("a/d", 
Url.parse("../../a/b/../c/../d/.").canonical().getPath());
+               assertEquals("a", 
Url.parse("../../a/b/../c/../d/..").canonical().getPath());
+               assertEquals("", 
Url.parse("../../a/b/../c/../d/../..").canonical().getPath());
        }
 
        @Test

Reply via email to