From 0b0ddc6ed16072b6ba848c8354f5d17f0b3460a0 Mon Sep 17 00:00:00 2001 From: Sam Brannen Date: Thu, 28 Aug 2014 15:05:36 +0200 Subject: [PATCH] Honor scheme in MockHttpServletRequest.isSecure() Prior to this commit the implementation of isSecure() in MockHttpServletRequest simply returned the value of the 'secure' boolean flag. Thus setting the scheme to 'https' had no effect on the value returned by isSecure() even though most non-mock implementations (e.g., Tomcat, Jetty, etc.) base the return value on the actual scheme in the request. This commit makes the behavior of MockHttpServletRequest.isSecure() more intuitive by honoring both the 'secure' boolean flag and the current value of the scheme. Issue: SPR-12098 --- .../mock/web/MockHttpServletRequest.java | 26 +++++++++++++-- .../mock/web/MockHttpServletRequestTests.java | 32 +++++++++++++++++++ 2 files changed, 55 insertions(+), 3 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 510ad4926b..2c5360c440 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 @@ -75,10 +75,14 @@ import org.springframework.util.StringUtils; */ public class MockHttpServletRequest implements HttpServletRequest { + private static final String HTTP = "http"; + + private static final String HTTPS = "https"; + /** * The default protocol: 'http'. */ - public static final String DEFAULT_PROTOCOL = "http"; + public static final String DEFAULT_PROTOCOL = HTTP; /** * The default server address: '127.0.0.1'. @@ -701,13 +705,29 @@ public class MockHttpServletRequest implements HttpServletRequest { return Collections.enumeration(this.locales); } + /** + * Set the boolean {@code secure} flag indicating whether the mock request + * was made using a secure channel, such as HTTPS. + * @param secure a boolean indicating if the mock request was made using a + * secure channel + * @see #isSecure() + * @see #getScheme() + * @see #setScheme(String) + */ public void setSecure(boolean secure) { this.secure = secure; } + /** + * Returns {@code true} if the {@link #setSecure secure} flag has been set + * to {@code true} or if the {@link #getScheme scheme} is {@code https}. + *

+ * {@inheritDoc} + * @see javax.servlet.ServletRequest#isSecure() + */ @Override public boolean isSecure() { - return this.secure; + return this.secure || HTTPS.equalsIgnoreCase(this.getScheme()); } @Override @@ -1021,7 +1041,7 @@ public class MockHttpServletRequest implements HttpServletRequest { 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))) { + && ((HTTP.equalsIgnoreCase(scheme) && this.serverPort != 80) || (HTTPS.equalsIgnoreCase(scheme) && this.serverPort != 443))) { url.append(':').append(this.serverPort); } 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 633a267950..7cdde10168 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 @@ -334,6 +334,38 @@ public class MockHttpServletRequestTests { assertEquals("http://localhost", requestURL.toString()); } + @Test + public void isSecureWithHttpSchemeAndSecureFlagIsFalse() { + assertFalse(request.isSecure()); + request.setScheme("http"); + request.setSecure(false); + assertFalse(request.isSecure()); + } + + @Test + public void isSecureWithHttpSchemeAndSecureFlagIsTrue() { + assertFalse(request.isSecure()); + request.setScheme("http"); + request.setSecure(true); + assertTrue(request.isSecure()); + } + + @Test + public void isSecureWithHttpsSchemeAndSecureFlagIsFalse() { + assertFalse(request.isSecure()); + request.setScheme("https"); + request.setSecure(false); + assertTrue(request.isSecure()); + } + + @Test + public void isSecureWithHttpsSchemeAndSecureFlagIsTrue() { + assertFalse(request.isSecure()); + request.setScheme("https"); + request.setSecure(true); + assertTrue(request.isSecure()); + } + private void assertEqualEnumerations(Enumeration enum1, Enumeration enum2) { assertNotNull(enum1); assertNotNull(enum2);