Author: ivaynberg Date: Thu Feb 10 00:58:05 2011 New Revision: 1069181 URL: http://svn.apache.org/viewvc?rev=1069181&view=rev Log: added ability to render full urls rather then just relative or context-relative. fixed https switching. Issue: WICKET-3407
Added: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/Protocol.java (with props) Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebSession.java wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/HttpsMapper.java wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/HttpsRequestChecker.java wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/SwitchProtocolRequestHandler.java wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/string/UrlUtils.java wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/SwitchProtocolRequestHandlerTest.java wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/cycle/UrlRendererTest.java wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/Url.java wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/UrlRenderer.java wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/handler/RedirectRequestHandler.java Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebSession.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebSession.java?rev=1069181&r1=1069180&r2=1069181&view=diff ============================================================================== --- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebSession.java (original) +++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebSession.java Thu Feb 10 00:58:05 2011 @@ -206,7 +206,7 @@ public class WebSession extends Session IRequestHandler activeRequestHandler = requestCycle.getActiveRequestHandler(); String url = requestCycle.urlFor(activeRequestHandler).toString(); String relativeUrl = requestCycle.getUrlRenderer() - .renderContextPathRelativeUrl(url, request); + .renderContextPathRelativeUrl(url); Page browserInfoPage = newBrowserInfoPage(relativeUrl); throw new RestartResponseException(browserInfoPage); } Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java?rev=1069181&r1=1069180&r2=1069181&view=diff ============================================================================== --- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java (original) +++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java Thu Feb 10 00:58:05 2011 @@ -123,7 +123,7 @@ public class ServletWebRequest extends W { if (!isAjax()) { - return Url.parse(getUrl(httpServletRequest, filterPrefix).toString(), getCharset()); + return getUrl(httpServletRequest, filterPrefix); } else { @@ -138,9 +138,16 @@ public class ServletWebRequest extends W Checks.notNull(base, "Current ajax request is missing the base url header or parameter"); - return Url.parse(base, getCharset()); + return setParameters(Url.parse(base, getCharset())); } + } + private Url setParameters(Url url) + { + url.setPort(httpServletRequest.getServerPort()); + url.setHost(httpServletRequest.getServerName()); + url.setProtocol(httpServletRequest.getScheme()); + return url; } private Url getUrl(HttpServletRequest request, String filterPrefix) @@ -162,10 +169,9 @@ public class ServletWebRequest extends W url.append(query); } - return Url.parse(url.toString(), getCharset()); + return setParameters(Url.parse(url.toString(), getCharset())); } - /** * Returns the prefix of Wicket filter (without the leading /) * Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/HttpsMapper.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/HttpsMapper.java?rev=1069181&r1=1069180&r2=1069181&view=diff ============================================================================== --- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/HttpsMapper.java (original) +++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/HttpsMapper.java Thu Feb 10 00:58:05 2011 @@ -119,6 +119,18 @@ public class HttpsMapper implements IReq */ public Url mapHandler(IRequestHandler requestHandler) { - return delegate.mapHandler(checker.checkSecureOutgoing(requestHandler, httpsConfig)); + Url url = delegate.mapHandler(requestHandler); + switch (checker.getProtocol(requestHandler)) + { + case HTTP : + url.setProtocol("http"); + url.setPort(httpsConfig.getHttpPort()); + break; + case HTTPS : + url.setProtocol("https"); + url.setPort(httpsConfig.getHttpsPort()); + break; + } + return url; } } Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/HttpsRequestChecker.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/HttpsRequestChecker.java?rev=1069181&r1=1069180&r2=1069181&view=diff ============================================================================== --- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/HttpsRequestChecker.java (original) +++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/HttpsRequestChecker.java Thu Feb 10 00:58:05 2011 @@ -16,10 +16,8 @@ */ package org.apache.wicket.protocol.https; -import org.apache.wicket.protocol.https.SwitchProtocolRequestHandler.Protocol; import org.apache.wicket.request.IRequestHandler; -import org.apache.wicket.request.handler.BookmarkablePageRequestHandler; -import org.apache.wicket.request.handler.IPageRequestHandler; +import org.apache.wicket.request.handler.IPageClassRequestHandler; /** * A helper class which will replace the current {@link IRequestHandler request handler} with @@ -72,44 +70,29 @@ class HttpsRequestChecker } /** + * Figures out the protocol that should be used for a given request handler + * * @param requestHandler - * the original request handler - * @param httpsConfig - * the https configuration - * @return either {@link SwitchProtocolRequestHandler} if the page that is going to be rendered - * is annotated with @{@link RequireHttps} and the protocol of the current request is - * http, or will return the original handler if these conditions are not fulfilled + * @return protocol */ - IRequestHandler checkSecureOutgoing(IRequestHandler requestHandler, HttpsConfig httpsConfig) + public Protocol getProtocol(IRequestHandler requestHandler) { - - if (requestHandler != null && requestHandler instanceof SwitchProtocolRequestHandler) - { - return requestHandler; - } - Class<?> pageClass = getPageClass(requestHandler); if (pageClass != null) { - final IRequestHandler redirect; - if (hasSecureAnnotation(pageClass)) { - redirect = SwitchProtocolRequestHandler.requireProtocol(Protocol.HTTPS, - requestHandler, httpsConfig); + return Protocol.HTTPS; } else { - redirect = SwitchProtocolRequestHandler.requireProtocol(Protocol.HTTP, - requestHandler, httpsConfig); - } - if (redirect != null) - { - return redirect; + return Protocol.HTTP; } - } - return requestHandler; + else + { + return Protocol.PRESERVE_CURRENT; + } } /** @@ -147,13 +130,9 @@ class HttpsRequestChecker */ private Class<?> getPageClass(IRequestHandler handler) { - if (handler instanceof IPageRequestHandler) - { - return ((IPageRequestHandler)handler).getPageClass(); - } - else if (handler instanceof BookmarkablePageRequestHandler) + if (handler instanceof IPageClassRequestHandler) { - return ((BookmarkablePageRequestHandler)handler).getPageClass(); + return ((IPageClassRequestHandler)handler).getPageClass(); } else { Added: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/Protocol.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/Protocol.java?rev=1069181&view=auto ============================================================================== --- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/Protocol.java (added) +++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/Protocol.java Thu Feb 10 00:58:05 2011 @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.wicket.protocol.https; + +/** + * Protocols + */ +enum Protocol { + /*** HTTP */ + HTTP, + /** HTTPS */ + HTTPS, + /** CURRENT */ + PRESERVE_CURRENT +} \ No newline at end of file Propchange: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/Protocol.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/SwitchProtocolRequestHandler.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/SwitchProtocolRequestHandler.java?rev=1069181&r1=1069180&r2=1069181&view=diff ============================================================================== --- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/SwitchProtocolRequestHandler.java (original) +++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/https/SwitchProtocolRequestHandler.java Thu Feb 10 00:58:05 2011 @@ -32,18 +32,6 @@ import org.apache.wicket.util.lang.Args; class SwitchProtocolRequestHandler implements IRequestHandlerDelegate { - /** - * Protocols - */ - public enum Protocol { - /*** HTTP */ - HTTP, - /** HTTPS */ - HTTPS, - /** CURRENT */ - PRESERVE_CURRENT - } - /** the protocol this request handler is going to switch to */ private final Protocol protocol; Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java?rev=1069181&r1=1069180&r2=1069181&view=diff ============================================================================== --- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java (original) +++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java Thu Feb 10 00:58:05 2011 @@ -140,7 +140,7 @@ public class RequestCycle extends Reques protected UrlRenderer newUrlRenderer() { // All URLs will be rendered relative to current request (can be overridden afterwards) - return new UrlRenderer(getRequest().getClientUrl()); + return new UrlRenderer(getRequest().getClientUrl(), getRequest().getPrefixToContextPath()); } /** Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/string/UrlUtils.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/string/UrlUtils.java?rev=1069181&r1=1069180&r2=1069181&view=diff ============================================================================== --- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/string/UrlUtils.java (original) +++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/string/UrlUtils.java Thu Feb 10 00:58:05 2011 @@ -64,8 +64,7 @@ public class UrlUtils { if (isRelative(url)) { - return requestCycle.getUrlRenderer().renderContextPathRelativeUrl(url, - requestCycle.getRequest()); + return requestCycle.getUrlRenderer().renderContextPathRelativeUrl(url); } else { Modified: wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/SwitchProtocolRequestHandlerTest.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/SwitchProtocolRequestHandlerTest.java?rev=1069181&r1=1069180&r2=1069181&view=diff ============================================================================== --- wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/SwitchProtocolRequestHandlerTest.java (original) +++ wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/SwitchProtocolRequestHandlerTest.java Thu Feb 10 00:58:05 2011 @@ -23,7 +23,6 @@ import javax.servlet.http.HttpServletReq import org.apache.wicket.MockPage; import org.apache.wicket.protocol.http.servlet.ServletWebRequest; -import org.apache.wicket.protocol.https.SwitchProtocolRequestHandler.Protocol; import org.apache.wicket.request.IRequestCycle; import org.apache.wicket.request.IRequestHandler; import org.apache.wicket.request.Url; Modified: wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/cycle/UrlRendererTest.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/cycle/UrlRendererTest.java?rev=1069181&r1=1069180&r2=1069181&view=diff ============================================================================== --- wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/cycle/UrlRendererTest.java (original) +++ wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/cycle/UrlRendererTest.java Thu Feb 10 00:58:05 2011 @@ -35,7 +35,7 @@ public class UrlRendererTest extends Tes */ public void test1() { - UrlRenderer r1 = new UrlRenderer(Url.parse("foo/bar/baz?a=b")); + UrlRenderer r1 = new UrlRenderer(Url.parse("foo/bar/baz?a=b"), ""); assertEquals("./xyz?x=y", r1.renderUrl(Url.parse("foo/bar/xyz?x=y"))); assertEquals("./baz/xyz?x=y", r1.renderUrl(Url.parse("foo/bar/baz/xyz?x=y"))); assertEquals("../aaa/xyz?x=y", r1.renderUrl(Url.parse("foo/aaa/xyz?x=y"))); @@ -47,7 +47,7 @@ public class UrlRendererTest extends Tes */ public void test2() { - UrlRenderer r1 = new UrlRenderer(Url.parse("foo/bar/baz?a=b")); + UrlRenderer r1 = new UrlRenderer(Url.parse("foo/bar/baz?a=b"), ""); assertEquals("../../foo?x=y", r1.renderUrl(Url.parse("foo?x=y"))); assertEquals("../../aaa?x=y", r1.renderUrl(Url.parse("aaa?x=y"))); } @@ -57,7 +57,7 @@ public class UrlRendererTest extends Tes */ public void test3() { - UrlRenderer r1 = new UrlRenderer(Url.parse("?a=b")); + UrlRenderer r1 = new UrlRenderer(Url.parse("?a=b"), ""); assertEquals("a/b/c?x=y", r1.renderUrl(Url.parse("a/b/c?x=y"))); } @@ -66,7 +66,7 @@ public class UrlRendererTest extends Tes */ public void test5() { - UrlRenderer r1 = new UrlRenderer(Url.parse("url")); + UrlRenderer r1 = new UrlRenderer(Url.parse("url"), ""); assertEquals("./url?1", r1.renderUrl(Url.parse("url?1"))); } @@ -75,7 +75,7 @@ public class UrlRendererTest extends Tes */ public void test6() { - UrlRenderer r1 = new UrlRenderer(Url.parse("url/")); + UrlRenderer r1 = new UrlRenderer(Url.parse("url/"), ""); assertEquals("./x?1", r1.renderUrl(Url.parse("url/x?1"))); } @@ -85,7 +85,7 @@ public class UrlRendererTest extends Tes public void test7() { UrlRenderer r1 = new UrlRenderer( - Url.parse("MyTestPage/indexed1/indexed2/indexed3?10-27.ILinkListener-l2&p1=v1")); + Url.parse("MyTestPage/indexed1/indexed2/indexed3?10-27.ILinkListener-l2&p1=v1"), ""); assertEquals("../../../MyTestPage?10", r1.renderUrl(Url.parse("MyTestPage?10"))); } @@ -94,7 +94,7 @@ public class UrlRendererTest extends Tes */ public void test8() { - UrlRenderer r1 = new UrlRenderer(Url.parse("en/first-test-page?16-1.ILinkListener-l1")); + UrlRenderer r1 = new UrlRenderer(Url.parse("en/first-test-page?16-1.ILinkListener-l1"), ""); assertEquals("./first-test-page/indexed1/indexed2/indexed3?p1=v1", r1.renderUrl(Url.parse("en/first-test-page/indexed1/indexed2/indexed3?p1=v1"))); } @@ -104,7 +104,7 @@ public class UrlRendererTest extends Tes */ public void test9() { - UrlRenderer r1 = new UrlRenderer(Url.parse("a/b/q/d/e")); + UrlRenderer r1 = new UrlRenderer(Url.parse("a/b/q/d/e"), ""); assertEquals("../../../q/c/d/e", r1.renderUrl(Url.parse("a/q/c/d/e"))); } @@ -113,7 +113,6 @@ public class UrlRendererTest extends Tes */ public void test10() { - UrlRenderer r1 = new UrlRenderer(Url.parse("a/b/q/d/e")); HttpServletRequest httpRequest = Mockito.mock(HttpServletRequest.class); Mockito.when(httpRequest.getCharacterEncoding()).thenReturn("UTF-8"); @@ -121,15 +120,16 @@ public class UrlRendererTest extends Tes Mockito.when(httpRequest.getRequestURI()).thenReturn("/contextPath/filterPath/anything"); ServletWebRequest request = new ServletWebRequest(httpRequest, "filterPath/"); + UrlRenderer r1 = new UrlRenderer(Url.parse("a/b/q/d/e"), request.getPrefixToContextPath()); - assertEquals("../../../../../", r1.renderContextPathRelativeUrl("", request)); - assertEquals("../../../../../", r1.renderContextPathRelativeUrl("/", request)); - assertEquals("../../../../../f", r1.renderContextPathRelativeUrl("/f", request)); - assertEquals("../../../../../../f", r1.renderContextPathRelativeUrl("../f", request)); + assertEquals("../../../../../", r1.renderContextPathRelativeUrl("")); + assertEquals("../../../../../", r1.renderContextPathRelativeUrl("/")); + assertEquals("../../../../../f", r1.renderContextPathRelativeUrl("/f")); + assertEquals("../../../../../../f", r1.renderContextPathRelativeUrl("../f")); try { - r1.renderContextPathRelativeUrl(null, request); + r1.renderContextPathRelativeUrl(null); fail("Null 'url' is not allowed!"); } catch (IllegalArgumentException iax) @@ -143,7 +143,7 @@ public class UrlRendererTest extends Tes */ public void test11() { - UrlRenderer r1 = new UrlRenderer(Url.parse("a")); + UrlRenderer r1 = new UrlRenderer(Url.parse("a"), ""); assertEquals(".", r1.renderUrl(Url.parse(""))); } } 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=1069181&r1=1069180&r2=1069181&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 Thu Feb 10 00:58:05 2011 @@ -69,6 +69,10 @@ public final class Url implements Serial private String charsetName; private transient Charset _charset; + private String protocol; + private Integer port; + private String host; + /** * * @param qp @@ -804,4 +808,66 @@ public final class Url implements Serial parameters.clear(); parameters.addAll(relative.getQueryParameters()); } + + /** + * Gets the protocol of this url (http/https/etc) + * + * @return protocol or {@code null} if none has been set + */ + public String getProtocol() + { + return protocol; + } + + /** + * Sets the protocol of this url (http/https/etc) + * + * @param protocol + */ + public void setProtocol(String protocol) + { + this.protocol = protocol; + } + + /** + * Gets the port of this url + * + * @return port or {@code null} if none has been set + */ + public Integer getPort() + { + return port; + } + + /** + * Sets the port of this url + * + * @param port + */ + public void setPort(Integer port) + { + this.port = port; + } + + /** + * Gets the host name of this url + * + * @return host name or {@code null} if none is seto + */ + public String getHost() + { + return host; + } + + /** + * Sets the host name of this url + * + * @param host + */ + public void setHost(String host) + { + this.host = host; + } + + } Modified: wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/UrlRenderer.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/UrlRenderer.java?rev=1069181&r1=1069180&r2=1069181&view=diff ============================================================================== --- wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/UrlRenderer.java (original) +++ wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/UrlRenderer.java Thu Feb 10 00:58:05 2011 @@ -17,36 +17,54 @@ package org.apache.wicket.request; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.apache.wicket.util.lang.Args; import org.apache.wicket.util.string.PrependingStringBuffer; +import org.apache.wicket.util.string.Strings; /** - * Takes care of rendering relative (or in future possibly absolute - depending on configuration) - * URLs. + * Takes care of rendering URLs. * <p> - * All Urls are rendered relative to the base Url. Base Url is normally Url of the page being + * Normally Urls are rendered relative to the base Url. Base Url is normally Url of the page being * rendered. However, during Ajax request and redirect to buffer rendering the BaseUrl needs to be * adjusted. * * @author Matej Knopp + * @author Igor Vaynberg */ public class UrlRenderer { + private static Map<String, Integer> PROTO_TO_PORT = new HashMap<String, Integer>(); + static + { + PROTO_TO_PORT.put("http", 80); + PROTO_TO_PORT.put("https", 443); + } + + private Url baseUrl; + private final Url originalBaseUrl; + private final String prefixToContextPath; + /** * Construct. * * @param base * base Url. All generated Urls will be relative to this Url. + * @param prefixToContextPath + * prefix that when prepended to {@code base} will make it context-relative */ - public UrlRenderer(final Url base) + public UrlRenderer(final Url base, String prefixToContextPath) { Args.notNull(base, "base"); - + Args.notNull(prefixToContextPath, "prefixToContextPath"); baseUrl = base; + originalBaseUrl = baseUrl; + this.prefixToContextPath = prefixToContextPath; } /** @@ -75,6 +93,92 @@ public class UrlRenderer } /** + * Renders the Url + * + * @param url + * @return Url rendered as string + */ + public String renderUrl(final Url url) + { + if (shouldRenderAsFull(url)) + { + return renderFullUrl(url); + } + else + { + return renderRelativeUrl(url); + } + } + + /** + * Renders a full URL in the {@code protocol://hostname:port/path} format + * + * @param url + * @return rendered URL + */ + public String renderFullUrl(Url url) + { + StringBuilder render = new StringBuilder(); + + final String protocol = resolveProtocol(url); + final String host = resolveHost(url); + final Integer port = resolvePort(url); + final String path = url.toString(); + + render.append(protocol).append("://").append(host); + + if (port != null && !port.equals(PROTO_TO_PORT.get(protocol))) + { + render.append(":").append(port); + } + + if (!path.startsWith("/")) + { + render.append("/"); + } + + render.append(path); + + return render.toString(); + } + + /** + * Gets port that should be used to render the url + * + * @param url + * url being rendered + * @return port or {@code null} if none is set + */ + protected Integer resolvePort(Url url) + { + return choose(url.getPort(), baseUrl.getPort(), originalBaseUrl.getPort()); + } + + /** + * Gets the host name that should be used to render the url + * + * @param url + * url being rendered + * @return the host name or {@code null} if none is set + */ + protected String resolveHost(Url url) + { + return choose(url.getHost(), baseUrl.getHost(), originalBaseUrl.getHost()); + } + + /** + * Gets the protocol that should be used to render the url + * + * @param url + * url being rendered + * @return the protocol or {@code null} if none is set + */ + protected String resolveProtocol(Url url) + { + return choose(url.getProtocol(), baseUrl.getProtocol(), originalBaseUrl.getProtocol()); + } + + /** * Renders the Url relative to currently set Base Url. * * This method is only intended for Wicket URLs, because the {@link Url} object represents part @@ -85,7 +189,7 @@ public class UrlRenderer * @param url * @return Url rendered as string */ - public String renderUrl(final Url url) + public String renderRelativeUrl(final Url url) { Args.notNull(url, "url"); @@ -144,13 +248,36 @@ public class UrlRenderer } /** + * Determines whether a URL should be rendered in its full form + * + * @param url + * @return {@code true} if URL should be rendered in the full form + */ + protected boolean shouldRenderAsFull(Url url) + { + if (!Strings.isEmpty(url.getProtocol()) && !url.getProtocol().equals(baseUrl.getProtocol())) + { + return true; + } + if (!Strings.isEmpty(url.getHost()) && !url.getHost().equals(baseUrl.getHost())) + { + return true; + } + if (url.getPort() != null && !url.getPort().equals(baseUrl.getPort())) + { + return true; + } + return false; + } + + /** * Renders the URL within context relative to current base URL. * * @param url * @param request * @return relative URL */ - public String renderContextPathRelativeUrl(String url, final Request request) + public String renderContextPathRelativeUrl(String url) { Args.notNull(url, "url"); @@ -165,8 +292,34 @@ public class UrlRenderer buffer.prepend("../"); } - buffer.prepend(request.getPrefixToContextPath()); + buffer.prepend(prefixToContextPath); return buffer.toString(); } + + private static String choose(String value, String fallback1, String fallback2) + { + if (Strings.isEmpty(value)) + { + value = fallback1; + if (Strings.isEmpty(value)) + { + value = fallback2; + } + } + return value; + } + + private static Integer choose(Integer value, Integer fallback1, Integer fallback2) + { + if (value == null) + { + value = fallback1; + if (value == null) + { + value = fallback2; + } + } + return value; + } } Modified: wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/handler/RedirectRequestHandler.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/handler/RedirectRequestHandler.java?rev=1069181&r1=1069180&r2=1069181&view=diff ============================================================================== --- wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/handler/RedirectRequestHandler.java (original) +++ wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/handler/RedirectRequestHandler.java Thu Feb 10 00:58:05 2011 @@ -80,8 +80,7 @@ public class RedirectRequestHandler impl if (redirectUrl.startsWith("/")) { // context-absolute url - location = requestCycle.getUrlRenderer().renderContextPathRelativeUrl(redirectUrl, - requestCycle.getRequest()); + location = requestCycle.getUrlRenderer().renderContextPathRelativeUrl(redirectUrl); } else {