From 86591e5e5aeb7eead1798069d8b6f9c1790f4b9d Mon Sep 17 00:00:00 2001 From: Sam Brannen Date: Sun, 9 Jun 2013 11:55:24 +0200 Subject: [PATCH] Support implicit ports in MHSR.getRequestURL() Prior to this commit, MockHttpServletRequest.getRequestURL() always included the server port number in the reconstructed request URL, even for implicit ports (i.e., 80 and 443) and negative ports. MockHttpServletRequest.getRequestURL() now omits the port number when reconstructing a URL that has an implicit or negative port. Issue: SPR-9726 --- .../mock/web/MockHttpServletRequest.java | 10 ++++-- .../mock/web/MockHttpServletRequestTests.java | 33 +++++++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java b/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java index 533d52064a..722250cb9d 100644 --- a/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java +++ b/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java @@ -36,6 +36,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; + import javax.servlet.AsyncContext; import javax.servlet.DispatcherType; import javax.servlet.RequestDispatcher; @@ -946,8 +947,13 @@ public class MockHttpServletRequest implements HttpServletRequest { @Override public StringBuffer getRequestURL() { - StringBuffer url = new StringBuffer(this.scheme); - url.append("://").append(this.serverName).append(':').append(this.serverPort); + StringBuffer url = new StringBuffer(this.scheme).append("://").append(this.serverName); + + if (this.serverPort > 0 + && (("http".equalsIgnoreCase(scheme) && this.serverPort != 80) || ("https".equalsIgnoreCase(scheme) && this.serverPort != 443))) { + url.append(':').append(this.serverPort); + } + url.append(getRequestURI()); return url; } diff --git a/spring-test/src/test/java/org/springframework/mock/web/MockHttpServletRequestTests.java b/spring-test/src/test/java/org/springframework/mock/web/MockHttpServletRequestTests.java index a237bb00d1..5eb2c42a62 100644 --- a/spring-test/src/test/java/org/springframework/mock/web/MockHttpServletRequestTests.java +++ b/spring-test/src/test/java/org/springframework/mock/web/MockHttpServletRequestTests.java @@ -193,6 +193,39 @@ public class MockHttpServletRequestTests { assertEqualEnumerations(Collections.enumeration(preferredLocales), request.getLocales()); } + @Test + public void getRequestURL() { + request.setServerPort(8080); + request.setRequestURI("/path"); + assertEquals("http://localhost:8080/path", request.getRequestURL().toString()); + + request.setScheme("https"); + request.setServerName("example.com"); + request.setServerPort(8443); + assertEquals("https://example.com:8443/path", request.getRequestURL().toString()); + } + + @Test + public void getRequestURLWithDefaults() { + StringBuffer requestURL = request.getRequestURL(); + assertEquals("http://localhost", requestURL.toString()); + } + + @Test + public void getRequestURLWithDefaultsAndHttps() { + request.setScheme("https"); + request.setServerPort(443); + StringBuffer requestURL = request.getRequestURL(); + assertEquals("https://localhost", requestURL.toString()); + } + + @Test + public void getRequestURLWithNegativePort() { + request.setServerPort(-99); + StringBuffer requestURL = request.getRequestURL(); + assertEquals("http://localhost", requestURL.toString()); + } + private void assertEqualEnumerations(Enumeration enum1, Enumeration enum2) { assertNotNull(enum1); assertNotNull(enum2);