Updated Branches: refs/heads/master 4f7d2e474 -> b1e68de91
WICKET-5065 Improve UrlRenderer to be able to render urls without scheme and/or host Update Url's javadoc that it could be full url. (this is true since a long time). Improve Url#toString(StringMode.FULL) to be able to render urls without protocol (e.g. '//hostname/path') Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/b1e68de9 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/b1e68de9 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/b1e68de9 Branch: refs/heads/master Commit: b1e68de911c0ccb71df58a6744bf3ad18c2f265d Parents: 4f7d2e4 Author: Martin Tzvetanov Grigorov <[email protected]> Authored: Fri Mar 1 13:06:17 2013 +0200 Committer: Martin Tzvetanov Grigorov <[email protected]> Committed: Fri Mar 1 13:06:17 2013 +0200 ---------------------------------------------------------------------- .../http/servlet/ServletWebRequestTest.java | 8 +- .../main/java/org/apache/wicket/request/Url.java | 71 +++++++++------ .../java/org/apache/wicket/request/UrlTest.java | 30 ++++++- 3 files changed, 75 insertions(+), 34 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/b1e68de9/wicket-core/src/test/java/org/apache/wicket/protocol/http/servlet/ServletWebRequestTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/protocol/http/servlet/ServletWebRequestTest.java b/wicket-core/src/test/java/org/apache/wicket/protocol/http/servlet/ServletWebRequestTest.java index 132b424..8e3cfe1 100644 --- a/wicket-core/src/test/java/org/apache/wicket/protocol/http/servlet/ServletWebRequestTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/protocol/http/servlet/ServletWebRequestTest.java @@ -49,20 +49,20 @@ public class ServletWebRequestTest extends Assert public void wicket3599() { MockHttpServletRequest httpRequest = new MockHttpServletRequest(null, null, null); - httpRequest.setURL("/" + httpRequest.getContextPath() + "/request/Uri"); + httpRequest.setURL(httpRequest.getContextPath() + "/request/Uri"); httpRequest.setParameter("some", "parameter"); - ServletWebRequest webRequest = new ServletWebRequest(httpRequest, "/"); + ServletWebRequest webRequest = new ServletWebRequest(httpRequest, ""); Url clientUrl = webRequest.getClientUrl(); assertEquals("request/Uri?some=parameter", clientUrl.toString()); // simulates a request that has errors metadata httpRequest.setAttribute("javax.servlet.error.request_uri", - "/" + httpRequest.getContextPath() + "/any/source/of/error"); + httpRequest.getContextPath() + "/any/source/of/error"); ServletWebRequest errorWebRequest = new ServletWebRequest(httpRequest, "/"); Url errorClientUrl = errorWebRequest.getClientUrl(); - assertEquals("/any/source/of/error", errorClientUrl.toString()); + assertEquals("any/source/of/error", errorClientUrl.toString()); } /** http://git-wip-us.apache.org/repos/asf/wicket/blob/b1e68de9/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 191ebbe..12ca5f0 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 @@ -33,27 +33,36 @@ import org.apache.wicket.util.string.StringValue; import org.apache.wicket.util.string.Strings; /** - * Represents the URL part <b>after Wicket Filter</b>. For example if Wicket Filter is mapped to - * <code>/app/*</code> then with URL <code>/app/my/url</code> the {@link Url} object would represent - * part <code>my/url</code>. If Wicket Filter is mapped to <code>/*</code> then with URL - * <code>/my/url</code> the {@link Url} object would represent <code>my/url</code> (without leading - * the slash). - * <p> - * URL consists of segments and query parameters. + * Represents the URL to an external resource or internal resource/component. * <p> + * A url could be: + * <ul> + * <li>full - consists of an optional protocol/scheme, a host name, an optional port, + * optional segments and and optional query parameters.</li> + * <li>non-full: + * <ul> + * <li>absolute - a url relative to the host name. Such url may escape from the application by using + * different context path and/or different filter path. For example: <code>/foo/bar</code></li> + * <li>relative - a url relative to the current base url. The base url is the url of the currently rendered page. + * For example: <code>foo/bar</code>, <code>../foo/bar</code></li> + * </ul> + * </ul> + * + * </p> + * * Example URLs: * - * <pre> - * foo/bar/baz?a=1&b=5 - segments: ["foo","bar,"baz], query parameters: ["a"="1", "b"="5"] - * foo/bar//baz?=4&6 - segments: ["foo", "bar", "", "baz"], query parameters: [""="4", "6"=""] - * /foo/bar/ - segments: ["", "foo", "bar", ""] - * foo/bar// - segments: ["foo", "bar", "", ""] - * ?a=b - segments: [ ], query parameters: ["a"="b"] - * / - segments: ["", ""] (note that Url represents part after Wicket Filter - * - so if Wicket filter is mapped to /* this would be - * an additional slash, i.e. // - * </pre> - * + * <ul> + * <li>http://hostname:1234/foo/bar?a=b - protocol: http, host: hostname, port: 1234, segments: ["foo","bar"] </li> + * <li>//hostname:1234/foo/bar?a=b - protocol: null, host: hostname, port: 1234, segments: ["foo","bar"] </li> + * <li>foo/bar/baz?a=1&b=5 - segments: ["foo","bar","baz"], query parameters: ["a"="1", "b"="5"]</li> + * <li>foo/bar//baz?=4&6 - segments: ["foo", "bar", "", "baz"], query parameters: [""="4", "6"=""]</li> + * <li>/foo/bar/ - segments: ["", "foo", "bar", ""]</li> + * <li>foo/bar// - segments: ["foo", "bar", "", ""]</li> + * <li>?a=b - segments: [ ], query parameters: ["a"="b"]</li> + * <li></li> + * </ul> + * * The Url class takes care of encoding and decoding of the segments and parameters. * * @author Matej Knopp @@ -221,13 +230,19 @@ public class Url implements Serializable // get absolute / relative part of url String relativeUrl; - // absolute urls contain a scheme:// final int idxOfFirstSlash = absoluteUrl.indexOf('/'); final int protocolAt = absoluteUrl.indexOf("://"); - if (protocolAt > -1 && (protocolAt < idxOfFirstSlash)) + // full urls start either with a "scheme://" or with "//" + boolean protocolLess = absoluteUrl.startsWith("//"); + final boolean isFull = (protocolAt > 1 && (protocolAt < idxOfFirstSlash)) || protocolLess; + + if (isFull) { - result.protocol = absoluteUrl.substring(0, protocolAt).toLowerCase(Locale.US); + if (protocolLess == false) + { + result.protocol = absoluteUrl.substring(0, protocolAt).toLowerCase(Locale.US); + } final String afterProto = absoluteUrl.substring(protocolAt + 3); final String hostAndPort; @@ -642,15 +657,15 @@ public class Url implements Serializable StringMode.FULL.name() + " mode because it does not have a host set."); } - String protocol = this.protocol; - if (Strings.isEmpty(protocol)) + if (Strings.isEmpty(protocol) == false) { - protocol = "http"; + result.append(protocol); + result.append("://"); + } + else if (Strings.isEmpty(protocol) && Strings.isEmpty(host) == false) + { + result.append("//"); } - - // output scheme://host:port if specified - result.append(protocol); - result.append("://"); result.append(host); if (port != null && port.equals(getDefaultPortForProtocol(protocol)) == false) http://git-wip-us.apache.org/repos/asf/wicket/blob/b1e68de9/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 74af6f7..91a4914 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 @@ -86,7 +86,10 @@ public class UrlTest extends Assert { String s = "//foo/bar/"; Url url = Url.parse(s); - checkSegments(url, "", "", "foo", "bar", ""); + assertNull(url.getProtocol()); + assertEquals("foo", url.getHost()); + assertNull(url.getPort()); + checkSegments(url, "", "bar", ""); checkQueryParams(url); } @@ -98,6 +101,7 @@ public class UrlTest extends Assert { String s = "/foo/bar//"; Url url = Url.parse(s); + assertTrue(url.isAbsolute()); checkSegments(url, "", "foo", "bar", "", ""); checkQueryParams(url); } @@ -146,6 +150,7 @@ public class UrlTest extends Assert { String s = "/"; Url url = Url.parse(s); + assertTrue(url.isAbsolute()); checkSegments(url, "", ""); checkQueryParams(url); } @@ -158,6 +163,7 @@ public class UrlTest extends Assert { String s = "/?a=b"; Url url = Url.parse(s); + assertTrue(url.isAbsolute()); checkSegments(url, "", ""); checkQueryParams(url, "a", "b"); } @@ -170,6 +176,7 @@ public class UrlTest extends Assert { String s = "/?a"; Url url = Url.parse(s); + assertTrue(url.isAbsolute()); checkSegments(url, "", ""); checkQueryParams(url, "a", ""); } @@ -182,6 +189,7 @@ public class UrlTest extends Assert { String s = "/?a="; Url url = Url.parse(s); + assertTrue(url.isAbsolute()); checkSegments(url, "", ""); checkQueryParams(url, "a", ""); } @@ -194,6 +202,7 @@ public class UrlTest extends Assert { String s = "/?=b"; Url url = Url.parse(s); + assertTrue(url.isAbsolute()); checkSegments(url, "", ""); checkQueryParams(url, "", "b"); } @@ -206,6 +215,7 @@ public class UrlTest extends Assert { String s = "/?a=b&"; Url url = Url.parse(s); + assertTrue(url.isAbsolute()); checkSegments(url, "", ""); checkQueryParams(url, "a", "b"); } @@ -218,6 +228,7 @@ public class UrlTest extends Assert { String s = "/?a=b&+"; Url url = Url.parse(s); + assertTrue(url.isAbsolute()); checkSegments(url, "", ""); checkQueryParams(url, "a", "b", " ", ""); } @@ -235,6 +246,21 @@ public class UrlTest extends Assert } /** + * Make it possible to use full url without protocol + * https://issues.apache.org/jira/browse/WICKET-5065 + */ + @Test + public void parse16() + { + String s = "//localhost:56704;jsessionid=8kxeo3reannw1qjtxgkju8yiu"; + Url url = Url.parse(s); + assertNull(url.getProtocol()); + assertEquals("localhost", url.getHost()); + assertEquals(Integer.valueOf(56704), url.getPort()); + checkSegments(url, ";jsessionid=8kxeo3reannw1qjtxgkju8yiu"); + } + + /** * */ @Test @@ -270,7 +296,7 @@ public class UrlTest extends Assert { String s = "//absolute/url"; Url url = Url.parse(s); - assertEquals(url.toString(), s); + assertEquals(url.toString(StringMode.FULL), s); } /**
