Repository: wicket
Updated Branches:
  refs/heads/wicket-7.x 7ba197c68 -> 08f0f61fb


WICKET-6473 Flagging context relative URLs

- flagging context relative URLs used in the ServletWebRequest so
they don't lose their empty segments information when being processed
inside UrlRenderer

- preserving the base URL segments by sending a copy of it to
UrlRenderer#removeCommonPrefixes

- preserving empty segments of problematic and forward URIs by
hinting the URL parser they are not full


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

Branch: refs/heads/wicket-7.x
Commit: 08f0f61fbd8a5959e35b599fdf288dfe1f669d00
Parents: 7ba197c
Author: Pedro Santos <[email protected]>
Authored: Wed Jan 17 02:09:51 2018 -0200
Committer: Pedro Santos <[email protected]>
Committed: Tue Feb 20 21:32:43 2018 -0300

----------------------------------------------------------------------
 .../org/apache/wicket/mock/MockWebRequest.java  |  4 ++-
 .../http/servlet/ServletWebRequest.java         |  5 +--
 .../wicket/request/cycle/UrlRendererTest.java   | 18 +++++++++++
 .../java/org/apache/wicket/request/Url.java     | 34 ++++++++++++++++++--
 .../org/apache/wicket/request/UrlRenderer.java  |  8 +++--
 .../java/org/apache/wicket/request/UrlTest.java | 18 +++++++++++
 6 files changed, 80 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/08f0f61f/wicket-core/src/main/java/org/apache/wicket/mock/MockWebRequest.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/mock/MockWebRequest.java 
b/wicket-core/src/main/java/org/apache/wicket/mock/MockWebRequest.java
index 61e95c9..ffbbd6f 100644
--- a/wicket-core/src/main/java/org/apache/wicket/mock/MockWebRequest.java
+++ b/wicket-core/src/main/java/org/apache/wicket/mock/MockWebRequest.java
@@ -281,7 +281,9 @@ public class MockWebRequest extends WebRequest
        @Override
        public Url getClientUrl()
        {
-               return new Url(url.getSegments(), Collections.<QueryParameter> 
emptyList());
+               Url baseUrl = new Url(url.getSegments(), 
Collections.<QueryParameter> emptyList());
+               baseUrl.setContextRelative(url.isContextRelative());
+               return baseUrl;
        }
 
        @Override

http://git-wip-us.apache.org/repos/asf/wicket/blob/08f0f61f/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
 
b/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
index c668cdf..45b0544 100644
--- 
a/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
+++ 
b/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
@@ -132,13 +132,13 @@ public class ServletWebRequest extends WebRequest
        {
                if (errorAttributes != null && 
!Strings.isEmpty(errorAttributes.getRequestUri()))
                {
-                       String problematicURI = 
Url.parse(errorAttributes.getRequestUri(), getCharset())
+                       String problematicURI = 
Url.parse(errorAttributes.getRequestUri(), getCharset(), false)
                                .toString();
                        return getContextRelativeUrl(problematicURI, 
filterPrefix);
                }
                else if (forwardAttributes != null && 
!Strings.isEmpty(forwardAttributes.getRequestUri()))
                {
-                       String forwardURI = 
Url.parse(forwardAttributes.getRequestUri(), getCharset())
+                       String forwardURI = 
Url.parse(forwardAttributes.getRequestUri(), getCharset(), false)
                                .toString();
                        return getContextRelativeUrl(forwardURI, filterPrefix);
                }
@@ -170,6 +170,7 @@ public class ServletWebRequest extends WebRequest
                url.setPort(httpServletRequest.getServerPort());
                url.setHost(httpServletRequest.getServerName());
                url.setProtocol(httpServletRequest.getScheme());
+               url.setContextRelative(true);
                return url;
        }
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/08f0f61f/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 b294b4f..a64ae61 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
@@ -16,6 +16,9 @@
  */
 package org.apache.wicket.request.cycle;
 
+import static java.util.Arrays.asList;
+import static org.hamcrest.CoreMatchers.is;
+
 import java.util.Arrays;
 
 import org.apache.wicket.mock.MockWebRequest;
@@ -29,6 +32,7 @@ import org.junit.Test;
  */
 public class UrlRendererTest extends Assert
 {
+
        /**
         * 
         */
@@ -188,6 +192,20 @@ public class UrlRendererTest extends Assert
                        
r1.renderRelativeUrl(Url.parse("http://localhost:8080/;jsessionid=1p87c5424zjuvd57kljcu2bwa?0-1.IBehaviorListener.1-component";)));
        }
 
+       @Test
+       public void rendersRelativeUrl()
+       {
+               Url contextRelativeUrl = new Url();
+               contextRelativeUrl.setProtocol("http");
+               contextRelativeUrl.setHost("localshot");
+               contextRelativeUrl.setPort(8080);
+               contextRelativeUrl.setContextRelative(true);
+               contextRelativeUrl.getSegments().addAll(asList("", ""));
+
+               UrlRenderer r1 = new UrlRenderer(new 
MockWebRequest(contextRelativeUrl));
+               assertThat(r1.renderRelativeUrl(Url.parse("foo")), 
is("../foo"));
+       }
+
        /**
         * WICKET-4935 prevent another double slash
         */

http://git-wip-us.apache.org/repos/asf/wicket/blob/08f0f61f/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 4a078df..e9d4e71 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
@@ -88,6 +88,14 @@ public class Url implements Serializable
        private String fragment;
 
        /**
+        * Flags the URL as relative to the application context. It is a 
special type of URL, used
+        * internally to hold the client data: protocol + host + port + 
relative segments
+        * 
+        * Unlike absolute URLs, a context relative one has no context or 
filter mapping segments
+        */
+       private boolean contextRelative;
+
+       /**
         * Modes with which urls can be stringized
         * 
         * @author igor
@@ -489,7 +497,7 @@ public class Url implements Serializable
         */
        public boolean isContextAbsolute()
        {
-               return !isFull() && !getSegments().isEmpty() && 
Strings.isEmpty(getSegments().get(0));
+               return !contextRelative && !isFull() && 
!getSegments().isEmpty() && Strings.isEmpty(getSegments().get(0));
        }
 
        /**
@@ -512,7 +520,7 @@ public class Url implements Serializable
         */
        public boolean isFull()
        {
-               return getHost() != null;
+               return !contextRelative && getHost() != null;
        }
 
        /**
@@ -1105,6 +1113,28 @@ public class Url implements Serializable
        }
 
        /**
+        * 
+        * Flags the URL as relative to the application context.
+        * 
+        * @param contextRelative
+        */
+       public void setContextRelative(boolean contextRelative)
+       {
+               this.contextRelative = contextRelative;
+       }
+
+       /**
+        * Tests if the URL is relative to the application context. If so, it 
holds all the information
+        * an absolute URL would have, minus the context and filter mapping 
segments
+        * 
+        * @return contextRelative
+        */
+       public boolean isContextRelative()
+       {
+               return contextRelative;
+       }
+
+       /**
         * Gets the port of this url
         * 
         * @return port or {@code null} if none has been set

http://git-wip-us.apache.org/repos/asf/wicket/blob/08f0f61f/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 a07896b..f4d8720 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
@@ -239,10 +239,14 @@ public class UrlRenderer
                        return renderer.renderRelativeUrl(url, getBaseUrl());
                }
 
-               List<String> baseUrlSegments = getBaseUrl().getSegments();
+               List<String> baseUrlSegments =  new 
ArrayList<>(getBaseUrl().getSegments());
                List<String> urlSegments = new ArrayList<>(url.getSegments());
 
-               removeCommonPrefixes(request, baseUrlSegments);
+               if (!getBaseUrl().isContextRelative())
+               {
+                       // so we remove any possible filter/context segments
+                       removeCommonPrefixes(request, baseUrlSegments);
+               }
                removeCommonPrefixes(request, urlSegments);
 
                List<String> newSegments = new ArrayList<>();

http://git-wip-us.apache.org/repos/asf/wicket/blob/08f0f61f/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 b2ef9a5..f5ab12c 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
@@ -905,6 +905,24 @@ public class UrlTest
        }
 
        @Test
+       public void contextRelativeIsntReadAsContextAbsolute() throws Exception
+       {
+               Url url = Url.parse("/segment");
+               url.setContextRelative(true);
+               assertThat(url.isContextRelative(), is(true));
+               assertThat(url.isContextAbsolute(), is(false));
+       }
+
+       @Test
+       public void contextRelativeIsntReadAsFull() throws Exception
+       {
+               Url url = Url.parse("http://www.example.com/segment";);
+               url.setContextRelative(true);
+               assertThat(url.isContextRelative(), is(true));
+               assertThat(url.isFull(), is(false));
+       }
+
+       @Test
        public void isContextAbsolute()
        {
                Url url = Url.parse("");

Reply via email to