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

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


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

commit d63af387f2750cb0e11ad58da870ca33ded85553
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.
    
    (cherry picked from commit 50eb3c78cddd1918f4db2bd3bd7d2a67406c51ab)
---
 .../org/apache/wicket/mock/MockWebRequest.java     |  6 +--
 .../apache/wicket/util/tester/WicketTester.java    | 31 +++++------
 .../wicket/request/cycle/UrlRendererTest.java      | 60 ++++++++++++++++++++++
 .../main/java/org/apache/wicket/request/Url.java   | 21 +++++++-
 .../org/apache/wicket/request/UrlRenderer.java     |  4 ++
 5 files changed, 102 insertions(+), 20 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 b84758a..921f841 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
@@ -31,7 +31,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;
 
@@ -43,7 +42,7 @@ import org.apache.wicket.request.http.WebRequest;
 public class MockWebRequest extends WebRequest
 {
        private Url url;
-       private List<Cookie> cookies = new ArrayList<Cookie>();
+       private List<Cookie> cookies = new ArrayList<>();
        private Map<String, List<Object>> headers = new HashMap<String, 
List<Object>>();
        private MockRequestParameters postRequestParameters = new 
MockRequestParameters();
        private Locale locale = Locale.getDefault();
@@ -283,7 +282,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/util/tester/WicketTester.java 
b/wicket-core/src/main/java/org/apache/wicket/util/tester/WicketTester.java
index 1addc55..b573a3a 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
@@ -142,22 +142,24 @@ 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:
- *
- * There are some expectations about wicket tester cookie handling which 
should match as best as it
- * can be with a real client server request response cycle: - all valid 
cookies set before a request
- * is made (tester.getRequest().addCookie()) should appear in the page request 
- all cookies set in
- * the response should appear in the last response (tester.getLastResponse()) 
after the request is
- * made (expired cookies and others) - all cookies set in the response should 
appear even after a
- * redirect response is made 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
+ * <h2>Cookie handling</h2>
+ * <p>
+ * There are some expectations about wicket tester cookie handling which 
should match as best as
+ * it can be with a real client server request response cycle:
+ * <ul>
+ *  <li> all valid cookies set before a request is made 
(tester.getRequest().addCookie()) should
+ *   appear in the page request</li>
+ *  <li> all cookies set in the response should appear in the last response 
(tester.getLastResponse())
+ *   after the request is made (expired cookies and others)</li>
+ *  <li> all cookies set in the response should appear even after a redirect 
response is made
+ *   until the final response (tester.getLastResponse()) is written to the 
client (wicket tester)</li>
+ *  <li> all valid cookies (maxAge!=0) from the last response should be added 
to
+ *   the next request cookies (tester.getRequest().getCookies())</li>
+ * </ul>
+ * </p>
  *
  * @author Ingram Chen
  * @author Juergen Donnerstag
@@ -166,7 +168,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/request/cycle/UrlRendererTest.java
 
b/wicket-core/src/test/java/org/apache/wicket/request/cycle/UrlRendererTest.java
index d1c6809..b7df849 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
@@ -733,4 +733,64 @@ class UrlRendererTest
                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