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
