Author: pete
Date: Sat Jun 25 01:22:07 2011
New Revision: 1139477
URL: http://svn.apache.org/viewvc?rev=1139477&view=rev
Log:
WICKET-3834 WicketTester does not follow absolute redirects: make Url.parse(..)
capable of parsing absolute urls
Added:
wicket/trunk/wicket-request/src/test/java/org/apache/wicket/request/UrlTest.java
- copied, changed from r1139453,
wicket/trunk/wicket-request/src/test/java/org/apache/wicket/request/UrlEncoderTest.java
Modified:
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/Url.java
Modified:
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/Url.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/Url.java?rev=1139477&r1=1139476&r2=1139477&view=diff
==============================================================================
---
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/Url.java
(original)
+++
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/Url.java
Sat Jun 25 01:22:07 2011
@@ -116,10 +116,11 @@ public final class Url implements Serial
* Parses the given URL string.
*
* @param url
+ * full absolute or relative url with query string
* @param charset
* @return Url object
*/
- public static Url parse(final String url, Charset charset)
+ public static Url parse(String url, Charset charset)
{
Args.notNull(url, "url");
@@ -128,36 +129,79 @@ public final class Url implements Serial
// the url object resolved the charset, use that
charset = result.getCharset();
- String segments;
- String query;
+ // extract query string part
+ final String queryString;
+ final String absoluteUrl;
- int qIndex = url.indexOf('?');
+ int queryAt = url.indexOf('?');
- if (qIndex == -1)
+ if (queryAt == -1)
{
- segments = url;
- query = "";
+ queryString = "";
+ absoluteUrl = url;
}
else
{
- segments = url.substring(0, qIndex);
- query = url.substring(qIndex + 1);
+ absoluteUrl = url.substring(0, queryAt);
+ queryString = url.substring(queryAt + 1);
}
+
+ // get absolute / relative part of url
+ String relativeUrl;
- if (segments.length() > 0)
+ // absolute urls contain a scheme://
+ final int protocolAt = absoluteUrl.indexOf("://");
+
+ if (protocolAt != -1)
+ {
+ result.protocol = absoluteUrl.substring(0, protocolAt);
+ final String afterProto =
absoluteUrl.substring(protocolAt + 3);
+ final String hostAndPort;
+
+ int relativeAt = afterProto.indexOf('/');
+
+ if (relativeAt == -1)
+ {
+ relativeUrl = "";
+ hostAndPort = afterProto;
+ }
+ else
+ {
+ relativeUrl = afterProto.substring(relativeAt);
+ hostAndPort = afterProto.substring(0,
relativeAt);
+ }
+
+ int portAt = hostAndPort.indexOf(':');
+
+ if (portAt == -1)
+ {
+ result.host = hostAndPort;
+ result.port = null;
+ }
+ else
+ {
+ result.host = hostAndPort.substring(0, portAt);
+ result.port =
Integer.parseInt(hostAndPort.substring(portAt + 1));
+ }
+ }
+ else
{
+ relativeUrl = absoluteUrl;
+ }
+ if (relativeUrl.length() > 0)
+ {
boolean removeLast = false;
- if (segments.endsWith("/"))
+ if (relativeUrl.endsWith("/"))
{
// we need to append something and remove it
after splitting
// because otherwise the
// trailing slashes will be lost
- segments += "/x";
+ relativeUrl += "/x";
removeLast = true;
}
- String segmentArray[] = Strings.split(segments, '/');
+ String segmentArray[] = Strings.split(relativeUrl, '/');
if (removeLast)
{
@@ -173,9 +217,9 @@ public final class Url implements Serial
}
}
- if (query.length() > 0)
+ if (queryString.length() > 0)
{
- String queryArray[] = Strings.split(query, '&');
+ String queryArray[] = Strings.split(queryString, '&');
for (String s : queryArray)
{
result.parameters.add(parseQueryParameter(s,
charset));
Copied:
wicket/trunk/wicket-request/src/test/java/org/apache/wicket/request/UrlTest.java
(from r1139453,
wicket/trunk/wicket-request/src/test/java/org/apache/wicket/request/UrlEncoderTest.java)
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/test/java/org/apache/wicket/request/UrlTest.java?p2=wicket/trunk/wicket-request/src/test/java/org/apache/wicket/request/UrlTest.java&p1=wicket/trunk/wicket-request/src/test/java/org/apache/wicket/request/UrlEncoderTest.java&r1=1139453&r2=1139477&rev=1139477&view=diff
==============================================================================
---
wicket/trunk/wicket-request/src/test/java/org/apache/wicket/request/UrlEncoderTest.java
(original)
+++
wicket/trunk/wicket-request/src/test/java/org/apache/wicket/request/UrlTest.java
Sat Jun 25 01:22:07 2011
@@ -16,25 +16,67 @@
*/
package org.apache.wicket.request;
-import org.apache.wicket.util.crypt.CharEncoding;
+import java.util.Arrays;
+
import org.junit.Assert;
import org.junit.Test;
/**
- * Tests for {@link UrlDecoder}
+ * Tests for {@link org.apache.wicket.request.Url}
*/
-public class UrlEncoderTest
+public class UrlTest extends Assert
{
+ @Test
+ public void parseRelativeUrl()
+ {
+ Url url = Url.parse("foo");
+ checkUrl(url, null, null, null, "foo");
+ assertFalse(url.isAbsolute());
+
+ url = Url.parse("foo/bar/baz");
+ checkUrl(url, null, null, null, "foo", "bar", "baz");
+ assertFalse(url.isAbsolute());
+
+ url = Url.parse("?foobar");
+ checkUrl(url, null, null, null);
+ assertEquals("", url.getQueryParameter("foobar").getValue());
+ assertFalse(url.isAbsolute());
+
+ url = Url.parse("foo?a=123");
+ checkUrl(url, null, null, null, "foo");
+ assertEquals("123", url.getQueryParameter("a").getValue());
+ assertFalse(url.isAbsolute());
+
+ url = Url.parse("/foo");
+ checkUrl(url, null, null, null, "", "foo");
+ assertTrue(url.isAbsolute());
+ }
- /**
- * <a
href="https://issues.apache.org/jira/browse/WICKET-3721">WICKET-3721</a> Encode
- * apostrophes because otherwise they get XML encoded by
ComponentTag#writeOutput() to
- * &#039; and eventually break links with javascript:
- */
@Test
- public void encodeApostrophe()
+ public void parseAbsoluteUrl()
+ {
+ Url url = Url.parse("ftp://myhost:8081");
+ checkUrl(url, "ftp", "myhost", 8081);
+ assertFalse(url.isAbsolute());
+
+ url = Url.parse("gopher://myhost:8081/foo");
+ checkUrl(url, "gopher", "myhost", 8081, "", "foo");
+ assertTrue(url.isAbsolute());
+
+ url = Url.parse("https://myhost/foo");
+ checkUrl(url, "https", "myhost", null, "", "foo");
+ assertTrue(url.isAbsolute());
+
+ url = Url.parse("https://myhost/foo:123");
+ checkUrl(url, "https", "myhost", null, "", "foo:123");
+ assertTrue(url.isAbsolute());
+ }
+
+ private void checkUrl(Url url, String protocol, String host, Integer
port, String... segments)
{
- Assert.assertEquals("someone%27s%20bad%20url",
- UrlEncoder.FULL_PATH_INSTANCE.encode("someone's bad
url", CharEncoding.UTF_8));
+ assertNotNull(url);
+ assertEquals(host, url.getHost());
+ assertEquals(port, url.getPort());
+ assertEquals(Arrays.asList(segments), url.getSegments());
}
}