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
-        * &amp;#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());
        }
 }


Reply via email to