Updated Branches: refs/heads/5.3 476968ae4 -> 282773de8
TAP5-1973: :443 added to URLs when using the Link.toAbsoluteURI(true) Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/282773de Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/282773de Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/282773de Branch: refs/heads/5.3 Commit: 282773de8beb7391a83b6cb63667f2cfebd2b936 Parents: 476968a Author: Howard M. Lewis Ship <[email protected]> Authored: Fri Aug 17 17:26:25 2012 -0700 Committer: Howard M. Lewis Ship <[email protected]> Committed: Fri Aug 17 17:26:47 2012 -0700 ---------------------------------------------------------------------- .../internal/services/BaseURLSourceImpl.java | 57 ++++- .../internal/services/BaseURLSourceImplTest.java | 186 +++++++++------ 2 files changed, 156 insertions(+), 87 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/282773de/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/BaseURLSourceImpl.java ---------------------------------------------------------------------- diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/BaseURLSourceImpl.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/BaseURLSourceImpl.java index 6fa049c..b7ea719 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/BaseURLSourceImpl.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/BaseURLSourceImpl.java @@ -1,4 +1,4 @@ -// Copyright 2008, 2010, 2011 The Apache Software Foundation +// Copyright 2008, 2010, 2011, 2012 The Apache Software Foundation // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -17,19 +17,20 @@ package org.apache.tapestry5.internal.services; import org.apache.tapestry5.SymbolConstants; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.ioc.annotations.Symbol; +import org.apache.tapestry5.ioc.internal.util.InternalUtils; import org.apache.tapestry5.services.BaseURLSource; import org.apache.tapestry5.services.Request; public class BaseURLSourceImpl implements BaseURLSource { private final Request request; - + private String hostname; private int hostPort; private int secureHostPort; public BaseURLSourceImpl(Request request, @Inject @Symbol(SymbolConstants.HOSTNAME) String hostname, - @Symbol(SymbolConstants.HOSTPORT) int hostPort, @Symbol(SymbolConstants.HOSTPORT_SECURE) int secureHostPort) + @Symbol(SymbolConstants.HOSTPORT) int hostPort, @Symbol(SymbolConstants.HOSTPORT_SECURE) int secureHostPort) { this.request = request; this.hostname = hostname; @@ -39,19 +40,49 @@ public class BaseURLSourceImpl implements BaseURLSource public String getBaseURL(boolean secure) { + return String.format("%s://%s%s", + secure ? "https" : "http", + hostname(), + portExtension(secure)); + } + + private String portExtension(boolean secure) + { int port = secure ? secureHostPort : hostPort; - String portSuffix = ""; - if (port <= 0) { + // The default for the ports is 0, which means to use Request.serverPort. That's mostly + // for development. + if (port <= 0) + { port = request.getServerPort(); - int schemeDefaultPort = request.isSecure() ? 443 : 80; - portSuffix = port == schemeDefaultPort ? "" : ":" + port; } - else if (secure && port != 443) portSuffix = ":" + port; - else if (port != 80) portSuffix = ":" + port; - - String hostname = "".equals(this.hostname) ? request.getServerName() : this.hostname.startsWith("$") ? System.getenv(this.hostname.substring(1)) : this.hostname; - - return String.format("%s://%s%s", secure ? "https" : "http", hostname, portSuffix); + + int expectedPort = secure ? 443 : 80; + + if (port == expectedPort) + { + return ""; + } + + return ":" + port; + } + + private String hostname() + { + + if (InternalUtils.isBlank(hostname)) + { + return request.getServerName(); + } + + // This is common in some PaaS deployments, such as Heroku, where the port is passed in as + // and environment variable. + + if (this.hostname.startsWith("$")) + { + return System.getenv(hostname.substring(1)); + } + + return hostname; } } http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/282773de/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/BaseURLSourceImplTest.java ---------------------------------------------------------------------- diff --git a/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/BaseURLSourceImplTest.java b/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/BaseURLSourceImplTest.java index b937b33..5dc4f89 100644 --- a/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/BaseURLSourceImplTest.java +++ b/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/BaseURLSourceImplTest.java @@ -1,74 +1,112 @@ -// Copyright 2008, 2010, 2011 The Apache Software Foundation -// -// Licensed 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.tapestry5.internal.services; - -import org.apache.tapestry5.internal.test.InternalBaseTestCase; -import org.apache.tapestry5.services.BaseURLSource; -import org.apache.tapestry5.services.Request; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - - -public class BaseURLSourceImplTest extends InternalBaseTestCase { - private Request request; - - @BeforeMethod - public void setUp() { - request = mockRequest(); - } - - @Test - public void getBaseURLFromRequest() { - expect(request.getServerName()).andReturn("localhost").once(); - expect(request.getServerPort()).andReturn(80).once(); - expect(request.isSecure()).andReturn(false).once(); - replay(); - BaseURLSource baseURLSource = new BaseURLSourceImpl(request, "localhost", 0, 0); - assertEquals(baseURLSource.getBaseURL(false), "http://localhost"); - } - - @Test - public void getBaseURLWithContributedHostname() { - expect(request.getServerPort()).andReturn(80).once(); - expect(request.isSecure()).andReturn(false).once(); - replay(); - BaseURLSource baseURLSource = new BaseURLSourceImpl(request, "my.server.com", 0, 0); - assertEquals(baseURLSource.getBaseURL(false), "http://my.server.com"); - } - - @Test - public void getBaseURLWithEnvHostname() { - expect(request.getServerPort()).andReturn(80).once(); - expect(request.isSecure()).andReturn(false).once(); - replay(); - BaseURLSource baseURLSource = new BaseURLSourceImpl(request, "$HOSTNAME", 0, 0); - assertEquals(baseURLSource.getBaseURL(false), "http://" + System.getenv("HOSTNAME")); - } - - @Test - public void getBaseURLWithContributedValuesDontUseRequest() { - replay(); - BaseURLSource baseURLSource = new BaseURLSourceImpl(request, "localhost", 80, 443); - assertEquals(baseURLSource.getBaseURL(false), "http://localhost"); - } - - @Test - public void getBaseURLWithContributedNonStandardSecurePort() { - replay(); - BaseURLSource baseURLSource = new BaseURLSourceImpl(request, "localhost", 80, 8443); - assertEquals(baseURLSource.getBaseURL(true), "https://localhost:8443"); - } - -} +// Copyright 2008, 2010, 2011, 2012 The Apache Software Foundation +// +// Licensed 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.tapestry5.internal.services; + +import org.apache.tapestry5.internal.test.InternalBaseTestCase; +import org.apache.tapestry5.services.BaseURLSource; +import org.apache.tapestry5.services.Request; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + + +public class BaseURLSourceImplTest extends InternalBaseTestCase +{ + private Request request; + + @BeforeMethod + public void setUp() + { + request = mockRequest(); + } + + @Test + public void server_name_from_request_object() + { + expect(request.getServerName()).andReturn("localhost").once(); + expect(request.getServerPort()).andReturn(80).once(); + + replay(); + + BaseURLSource baseURLSource = new BaseURLSourceImpl(request, "", 0, 0); + assertEquals(baseURLSource.getBaseURL(false), "http://localhost"); + + verify(); + } + + @Test + public void contributed_hostname() + { + expect(request.getServerPort()).andReturn(80).once(); + + replay(); + + BaseURLSource baseURLSource = new BaseURLSourceImpl(request, "my.server.com", 0, 0); + + assertEquals(baseURLSource.getBaseURL(false), "http://my.server.com"); + + verify(); + } + + @Test + public void hostname_from_environment_variable() + { + expect(request.getServerPort()).andReturn(80).once(); + + replay(); + + BaseURLSource baseURLSource = new BaseURLSourceImpl(request, "$HOSTNAME", 0, 0); + + assertEquals(baseURLSource.getBaseURL(false), "http://" + System.getenv("HOSTNAME")); + + verify(); + } + + @Test + public void insecure_url_using_default_port() + { + replay(); + + BaseURLSource baseURLSource = new BaseURLSourceImpl(request, "localhost", 80, 443); + + assertEquals(baseURLSource.getBaseURL(false), "http://localhost"); + + verify(); + } + + @Test + public void secure_url_using_default_port() + { + replay(); + + BaseURLSource baseURLSource = new BaseURLSourceImpl(request, "localhost", 80, 443); + + assertEquals(baseURLSource.getBaseURL(true), "https://localhost"); + + verify(); + } + + @Test + public void getBaseURLWithContributedNonStandardSecurePort() + { + replay(); + + BaseURLSource baseURLSource = new BaseURLSourceImpl(request, "localhost", 80, 8443); + + assertEquals(baseURLSource.getBaseURL(true), "https://localhost:8443"); + + verify(); + } + +}
