WICKET-5065 Improve UrlRenderer to be able to render urls without scheme and/or 
host


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

Branch: refs/heads/master
Commit: 9723ac3698bf37c7f44659d27f8d1c8ae1389730
Parents: ce0f1e9
Author: Martin Tzvetanov Grigorov <[email protected]>
Authored: Thu Feb 28 16:14:52 2013 +0200
Committer: Martin Tzvetanov Grigorov <[email protected]>
Committed: Thu Feb 28 16:14:52 2013 +0200

----------------------------------------------------------------------
 .../request/cycle/RequestCycleUrlForTest.java      |   19 +++---
 .../wicket/request/cycle/UrlRendererTest.java      |   50 +++++++++++++++
 .../org/apache/wicket/request/UrlRenderer.java     |   24 +++++--
 3 files changed, 79 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/9723ac36/wicket-core/src/test/java/org/apache/wicket/request/cycle/RequestCycleUrlForTest.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/test/java/org/apache/wicket/request/cycle/RequestCycleUrlForTest.java
 
b/wicket-core/src/test/java/org/apache/wicket/request/cycle/RequestCycleUrlForTest.java
index 9ad8a99..2ec1c7c 100644
--- 
a/wicket-core/src/test/java/org/apache/wicket/request/cycle/RequestCycleUrlForTest.java
+++ 
b/wicket-core/src/test/java/org/apache/wicket/request/cycle/RequestCycleUrlForTest.java
@@ -49,9 +49,9 @@ import org.junit.Test;
 public class RequestCycleUrlForTest extends Assert
 {
        private static final String JSESSIONID = ";jsessionid=1234567890";
-       private static final String BOOKMARKABLE_PAGE_URL = "/bookmarkablePage";
-       private static final String RES_REF_URL = "/resRef";
-       private static final String RESOURCE_URL = "/res";
+       private static final String BOOKMARKABLE_PAGE_URL = "bookmarkablePage";
+       private static final String RES_REF_URL = "resRef";
+       private static final String RESOURCE_URL = "res";
 
        RequestCycle requestCycle;
        
@@ -59,6 +59,9 @@ public class RequestCycleUrlForTest extends Assert
        public void before()
        {
                Request request = mock(Request.class);
+               Url baseUrl = Url.parse("");
+               when(request.getClientUrl()).thenReturn(baseUrl);
+
                Response response = new StringResponse() {
                        @Override
                        public String encodeURL(CharSequence url)
@@ -81,7 +84,7 @@ public class RequestCycleUrlForTest extends Assert
                RequestCycleContext context = new RequestCycleContext(request, 
response, mapper, exceptionMapper);
 
                requestCycle = new RequestCycle(context);
-               
requestCycle.getUrlRenderer().setBaseUrl(Url.parse("http://dummy-host";));
+               requestCycle.getUrlRenderer().setBaseUrl(baseUrl);
        }
 
        /**
@@ -115,7 +118,7 @@ public class RequestCycleUrlForTest extends Assert
                }; 
                ResourceReferenceRequestHandler handler = new 
ResourceReferenceRequestHandler(reference);
                CharSequence url = requestCycle.urlFor(handler);
-               assertEquals('.'+RES_REF_URL, url);
+               assertEquals("./"+RES_REF_URL, url);
        }
 
        /**
@@ -137,7 +140,7 @@ public class RequestCycleUrlForTest extends Assert
                };
                ResourceReferenceRequestHandler handler = new 
ResourceReferenceRequestHandler(reference);
                CharSequence url = requestCycle.urlFor(handler);
-               assertEquals('.'+RES_REF_URL+JSESSIONID, url);
+               assertEquals("./"+RES_REF_URL+JSESSIONID, url);
        }
 
        /**
@@ -151,7 +154,7 @@ public class RequestCycleUrlForTest extends Assert
                IStaticCacheableResource resource = 
mock(IStaticCacheableResource.class);
                ResourceRequestHandler handler = new 
ResourceRequestHandler(resource, new PageParameters());
                CharSequence url = requestCycle.urlFor(handler);
-               assertEquals('.'+RESOURCE_URL, url);
+               assertEquals("./"+RESOURCE_URL, url);
        }
 
        /**
@@ -165,7 +168,7 @@ public class RequestCycleUrlForTest extends Assert
                ByteArrayResource resource = new ByteArrayResource(null, new 
byte[] {1, 2}, "test.bin");
                ResourceRequestHandler handler = new 
ResourceRequestHandler(resource, new PageParameters());
                CharSequence url = requestCycle.urlFor(handler);
-               assertEquals('.'+RESOURCE_URL + JSESSIONID, url);
+               assertEquals("./"+RESOURCE_URL + JSESSIONID, url);
        }
 
        /**

http://git-wip-us.apache.org/repos/asf/wicket/blob/9723ac36/wicket-core/src/test/java/org/apache/wicket/request/cycle/UrlRendererTest.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/test/java/org/apache/wicket/request/cycle/UrlRendererTest.java
 
b/wicket-core/src/test/java/org/apache/wicket/request/cycle/UrlRendererTest.java
index a11e84a..e47bba1 100644
--- 
a/wicket-core/src/test/java/org/apache/wicket/request/cycle/UrlRendererTest.java
+++ 
b/wicket-core/src/test/java/org/apache/wicket/request/cycle/UrlRendererTest.java
@@ -467,4 +467,54 @@ public class UrlRendererTest extends Assert
                assertEquals("../../../../a/b;jsessionid=123456", 
encodedRelativeUrl);
        }
 
+       /**
+        * https://issues.apache.org/jira/browse/WICKET-5065
+        */
+       @Test
+       public void renderAbsoluteWithoutHost()
+       {
+               Url baseUrl = Url.parse("a/b");
+
+               MockWebRequest request = new MockWebRequest(baseUrl);
+               UrlRenderer renderer = new UrlRenderer(request);
+
+               Url absoluteUrl = Url.parse("/c/d");
+               String encodedRelativeUrl = renderer.renderUrl(absoluteUrl);
+
+               assertEquals("/c/d", encodedRelativeUrl);
+       }
+
+       /**
+        * https://issues.apache.org/jira/browse/WICKET-5065
+        */
+       @Test
+       public void renderAbsoluteWithoutScheme()
+       {
+               Url baseUrl = Url.parse("a/b");
+
+               MockWebRequest request = new MockWebRequest(baseUrl);
+               UrlRenderer renderer = new UrlRenderer(request);
+
+               Url absoluteUrl = Url.parse("//host/c/d");
+               String encodedRelativeUrl = renderer.renderUrl(absoluteUrl);
+
+               assertEquals("//host/c/d", encodedRelativeUrl);
+       }
+
+       /**
+        * https://issues.apache.org/jira/browse/WICKET-5065
+        */
+       @Test
+       public void renderAbsoluteWithoutSchemeWithPort()
+       {
+               Url baseUrl = Url.parse("a/b");
+
+               MockWebRequest request = new MockWebRequest(baseUrl);
+               UrlRenderer renderer = new UrlRenderer(request);
+
+               Url absoluteUrl = Url.parse("//host:1234/c/d");
+               String encodedRelativeUrl = renderer.renderUrl(absoluteUrl);
+
+               assertEquals("//host:1234/c/d", encodedRelativeUrl);
+       }
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/9723ac36/wicket-request/src/main/java/org/apache/wicket/request/UrlRenderer.java
----------------------------------------------------------------------
diff --git 
a/wicket-request/src/main/java/org/apache/wicket/request/UrlRenderer.java 
b/wicket-request/src/main/java/org/apache/wicket/request/UrlRenderer.java
index c4005cc..b2f7f13 100644
--- a/wicket-request/src/main/java/org/apache/wicket/request/UrlRenderer.java
+++ b/wicket-request/src/main/java/org/apache/wicket/request/UrlRenderer.java
@@ -150,14 +150,22 @@ public class UrlRenderer
                }
 
                StringBuilder render = new StringBuilder();
-               render.append(protocol);
-               render.append("://");
-               render.append(host);
-
-               if ((port != null) && !port.equals(PROTO_TO_PORT.get(protocol)))
+               if (Strings.isEmpty(protocol) == false)
                {
+                       render.append(protocol);
                        render.append(':');
-                       render.append(port);
+               }
+
+               if (Strings.isEmpty(host) == false)
+               {
+                       render.append("//");
+                       render.append(host);
+
+                       if ((port != null) && 
!port.equals(PROTO_TO_PORT.get(protocol)))
+                       {
+                               render.append(':');
+                               render.append(port);
+                       }
                }
 
                if (url.isAbsolute() == false)
@@ -355,6 +363,10 @@ public class UrlRenderer
                {
                        return true;
                }
+               if (url.isAbsolute()) {
+                       // do not relativize urls like "/a/b"
+                       return true;
+               }
                return false;
        }
 

Reply via email to