This is an automated email from the ASF dual-hosted git repository.

mgrigorov pushed a commit to branch wicket-8.x
in repository https://gitbox.apache.org/repos/asf/wicket.git


The following commit(s) were added to refs/heads/wicket-8.x by this push:
     new 50eb3c7  WICKET-6878 Rendering of relative Urls does not take into 
account filterpath for absolute Urls
50eb3c7 is described below

commit 50eb3c78cddd1918f4db2bd3bd7d2a67406c51ab
Author: Martin Tzvetanov Grigorov <[email protected]>
AuthorDate: Tue Apr 20 14:54:20 2021 +0300

    WICKET-6878 Rendering of relative Urls does not take into account 
filterpath for absolute Urls
    
    Urls created by Url#parse(fullUrlAsString) should be rendered as full url 
by UrlRenderer#rendered(url), no matter whether it has the same 
scheme/host/port as the base url.
    Wicket usually works with relative urls, but if the user uses full url for 
some reason then respect this and render it as full.
    
    At the moment UrlRenderer#renderRelativeUrl(url) will render it as relative 
to the current base url ignoring the scheme/host/port completely. This might be 
correct or not but too at the moment there is no need to change this behavior.
---
 .../org/apache/wicket/mock/MockWebRequest.java     |  4 +-
 .../protocol/http/mock/MockHttpServletRequest.java |  5 --
 .../apache/wicket/util/tester/WicketTester.java    |  8 +--
 .../org/apache/wicket/RequestEncodingTest.java     |  1 -
 .../wicket/request/cycle/UrlRendererTest.java      | 60 ++++++++++++++++++++++
 .../main/java/org/apache/wicket/request/Url.java   | 21 +++++++-
 .../org/apache/wicket/request/UrlRenderer.java     |  4 ++
 7 files changed, 87 insertions(+), 16 deletions(-)

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 00a1561..f14259c 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
@@ -29,7 +29,6 @@ import javax.servlet.http.Cookie;
 
 import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.request.Url;
-import org.apache.wicket.request.Url.QueryParameter;
 import org.apache.wicket.request.UrlUtils;
 import org.apache.wicket.request.http.WebRequest;
 import org.apache.wicket.util.time.Time;
@@ -282,7 +281,8 @@ public class MockWebRequest extends WebRequest
        @Override
        public Url getClientUrl()
        {
-               Url baseUrl = new Url(url.getSegments(), 
Collections.<QueryParameter> emptyList());
+               Url baseUrl = new Url(url);
+               baseUrl.getQueryParameters().clear();
                baseUrl.setContextRelative(url.isContextRelative());
                return baseUrl;
        }
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/protocol/http/mock/MockHttpServletRequest.java
 
b/wicket-core/src/main/java/org/apache/wicket/protocol/http/mock/MockHttpServletRequest.java
index bcbaf0d..f661727 100755
--- 
a/wicket-core/src/main/java/org/apache/wicket/protocol/http/mock/MockHttpServletRequest.java
+++ 
b/wicket-core/src/main/java/org/apache/wicket/protocol/http/mock/MockHttpServletRequest.java
@@ -70,8 +70,6 @@ import org.apache.wicket.util.io.IOUtils;
 import org.apache.wicket.util.string.StringValue;
 import org.apache.wicket.util.string.Strings;
 import org.apache.wicket.util.value.ValueMap;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 
 /**
@@ -157,9 +155,6 @@ public class MockHttpServletRequest implements 
HttpServletRequest
                }
        }
 
-       /** Logging object */
-       private static final Logger log = 
LoggerFactory.getLogger(MockHttpServletRequest.class);
-
        /** The application */
        private final Application application;
 
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/util/tester/WicketTester.java 
b/wicket-core/src/main/java/org/apache/wicket/util/tester/WicketTester.java
index 613bb02..ddebb4b 100644
--- a/wicket-core/src/main/java/org/apache/wicket/util/tester/WicketTester.java
+++ b/wicket-core/src/main/java/org/apache/wicket/util/tester/WicketTester.java
@@ -57,7 +57,6 @@ import org.apache.wicket.util.lang.Objects;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-
 /**
  * A helper class to ease unit testing of Wicket applications without the need 
for a servlet
  * container. To start a test, either use <code>startPage</code> or 
<code>startPanel</code>:
@@ -146,7 +145,7 @@ import org.slf4j.LoggerFactory;
  * {@link Component#getPageRelativePath()}. Since each Component has an 
ID/name, any Component can
  * also be referenced by its ID {@link MarkupContainer#get(String)}. And since 
MarkupContainer's and
  * its subclasses are containers which allow to add Components (in sync with 
the markup hierarchy),
- * you may not only access direct childs but also subchilds like 
get("myPanel:myForm:myNameField")
+ * you may not only access direct children but also grandchildren like 
get("myPanel:myForm:myNameField")
  * separating each ID with a ':'.
  * 
  * Cookie handling:
@@ -161,9 +160,7 @@ import org.slf4j.LoggerFactory;
  *   until the final response (tester.getLastResponse()) is written to the 
client (wicket tester) 
  * - all valid cookies (maxAge!=0) from the last response should be added to
  *   the next request cookies (tester.getRequest().getCookies())
- * 
- * 
- * TODO General: Example usage of FormTester
+ *
  * 
  * @author Ingram Chen
  * @author Juergen Donnerstag
@@ -172,7 +169,6 @@ import org.slf4j.LoggerFactory;
  */
 public class WicketTester extends BaseWicketTester
 {
-       /** log. */
        private static final Logger log = 
LoggerFactory.getLogger(WicketTester.class);
 
        /**
diff --git 
a/wicket-core/src/test/java/org/apache/wicket/RequestEncodingTest.java 
b/wicket-core/src/test/java/org/apache/wicket/RequestEncodingTest.java
index 8b66dce..c2607bd 100644
--- a/wicket-core/src/test/java/org/apache/wicket/RequestEncodingTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/RequestEncodingTest.java
@@ -17,7 +17,6 @@
 package org.apache.wicket;
 
 import org.apache.wicket.request.mapper.parameter.PageParameters;
-import org.apache.wicket.util.tester.WicketTestCase;
 import org.apache.wicket.util.tester.WicketTester;
 import org.junit.After;
 import org.junit.Assert;
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 a64ae61..b8b4e20 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
@@ -732,4 +732,64 @@ public class UrlRendererTest extends Assert
                String renderedUrl = renderer.renderUrl(Url.parse("abc..."));
                assertEquals("../abc...", renderedUrl);
        }
+
+       /**
+        * https://issues.apache.org/jira/browse/WICKET-6878
+        *
+        * When passing a full url to {@link UrlRenderer#renderUrl(Url)}
+        * always render it as full, i.e. with scheme, host and port (if 
available)
+        */
+       @Test
+       public void whenRenderingFullUrl_thenRenderItFull()
+       {
+               UrlRenderer renderer = new UrlRenderer(new 
MockWebRequest(Url.parse("http://localhost/a/b";)));
+
+               String renderedUrl = 
renderer.renderUrl(Url.parse("http://localhost/c/d";));
+               assertEquals("http://localhost/c/d";, renderedUrl);
+       }
+
+       /**
+        * https://issues.apache.org/jira/browse/WICKET-6878
+        *
+        * When passing a full url to {@link UrlRenderer#renderUrl(Url)}
+        * always render it as full, i.e. with scheme, host and port (if 
available)
+        */
+       @Test
+       public void whenRenderingFullUrlWithDifferentScheme_thenRenderItFull()
+       {
+               UrlRenderer renderer = new UrlRenderer(new 
MockWebRequest(Url.parse("http://localhost/a/b";)));
+
+               String renderedUrl = 
renderer.renderUrl(Url.parse("https://localhost/c/d";));
+               assertEquals("https://localhost/c/d";, renderedUrl);
+       }
+
+       /**
+        * https://issues.apache.org/jira/browse/WICKET-6878
+        *
+        * When passing a full url to {@link UrlRenderer#renderUrl(Url)}
+        * always render it as full, i.e. with scheme, host and port (if 
available)
+        */
+       @Test
+       public void whenRenderingFullUrlWithDifferentHost_thenRenderItFull()
+       {
+               UrlRenderer renderer = new UrlRenderer(new 
MockWebRequest(Url.parse("http://localhost/a/b";)));
+
+               String renderedUrl = 
renderer.renderUrl(Url.parse("http://another.host/c/d";));
+               assertEquals("http://another.host/c/d";, renderedUrl);
+       }
+
+       /**
+        * https://issues.apache.org/jira/browse/WICKET-6878
+        *
+        * When passing a full url to {@link UrlRenderer#renderUrl(Url)}
+        * always render it as full, i.e. with scheme, host and port (if 
available)
+        */
+       @Test
+       public void whenRenderingFullUrlWithDifferentPort_thenRenderItFull()
+       {
+               UrlRenderer renderer = new UrlRenderer(new 
MockWebRequest(Url.parse("http://localhost/a/b";)));
+
+               String renderedUrl = 
renderer.renderUrl(Url.parse("http://localhost:8080/c/d";));
+               assertEquals("http://localhost:8080/c/d";, renderedUrl);
+       }
 }
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 a056a22..8ccc8e8 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
@@ -95,11 +95,25 @@ public class Url implements Serializable
        private boolean contextRelative;
 
        /**
+        * A flag indicating that the Url is created from a full url, i.e.
+        * with scheme, host and optional port.
+        * Wicket usually works with relative urls. If a client wants to parse
+        * a full url then most probably it also expects this url to be rendered
+        * as full by {@link UrlRenderer#renderUrl(Url)}
+        */
+       private boolean shouldRenderAsFull;
+
+       public boolean shouldRenderAsFull()
+       {
+               return shouldRenderAsFull;
+       }
+
+       /**
         * Modes with which urls can be stringized
         * 
         * @author igor
         */
-       public static enum StringMode {
+       public enum StringMode {
                /** local urls are rendered without the host name */
                LOCAL,
                /**
@@ -147,6 +161,7 @@ public class Url implements Serializable
                parameters = new ArrayList<>(url.parameters);
                charsetName = url.charsetName;
                _charset = url._charset;
+               shouldRenderAsFull = url.shouldRenderAsFull;
        }
 
        /**
@@ -168,7 +183,7 @@ public class Url implements Serializable
         */
        public Url(final List<String> segments, final Charset charset)
        {
-               this(segments, Collections.<QueryParameter> emptyList(), 
charset);
+               this(segments, Collections.emptyList(), charset);
        }
 
        /**
@@ -272,6 +287,8 @@ public class Url implements Serializable
 
                if (isFull && isFullHint)
                {
+                       result.shouldRenderAsFull = true;
+
                        if (protocolLess == false)
                        {
                                result.protocol = absoluteUrl.substring(0, 
protocolAt).toLowerCase(Locale.US);
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 c02996a..4d0421f 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
@@ -361,6 +361,10 @@ public class UrlRenderer
         */
        protected boolean shouldRenderAsFull(final Url url)
        {
+               if (url.shouldRenderAsFull()) {
+                       return true;
+               }
+
                Url clientUrl = request.getClientUrl();
 
                if (!Strings.isEmpty(url.getProtocol()) &&

Reply via email to