diff --git a/spring-web/src/test/java/org/springframework/web/util/UriComponentsBuilderTests.java b/spring-web/src/test/java/org/springframework/web/util/UriComponentsBuilderTests.java index f5b5a94a1c6..a4ea70e3773 100644 --- a/spring-web/src/test/java/org/springframework/web/util/UriComponentsBuilderTests.java +++ b/spring-web/src/test/java/org/springframework/web/util/UriComponentsBuilderTests.java @@ -32,6 +32,7 @@ import java.util.Map; import org.junit.Test; +import org.springframework.http.HttpRequest; import org.springframework.http.server.ServletServerHttpRequest; import org.springframework.mock.web.test.MockHttpServletRequest; import org.springframework.util.LinkedMultiValueMap; @@ -237,8 +238,6 @@ public class UriComponentsBuilderTests { assertEquals("bar@baz", result.getQueryParams().getFirst("foo")); } - // Also see X-Forwarded-* related tests in ServletUriComponentsBuilderTests - @Test public void fromHttpRequest() throws URISyntaxException { MockHttpServletRequest request = new MockHttpServletRequest(); @@ -269,13 +268,140 @@ public class UriComponentsBuilderTests { request.setServerPort(80); request.setRequestURI("/rest/mobile/users/1"); - UriComponents result = UriComponentsBuilder.fromHttpRequest(new ServletServerHttpRequest(request)).build(); + HttpRequest httpRequest = new ServletServerHttpRequest(request); + UriComponents result = UriComponentsBuilder.fromHttpRequest(httpRequest).build(); + assertEquals("https", result.getScheme()); assertEquals("84.198.58.199", result.getHost()); assertEquals(-1, result.getPort()); assertEquals("/rest/mobile/users/1", result.getPath()); } + @Test + public void fromHttpRequestWithForwardedHost() { + MockHttpServletRequest request = new MockHttpServletRequest(); + request.setScheme("http"); + request.setServerName("localhost"); + request.setServerPort(-1); + request.setRequestURI("/mvc-showcase"); + request.addHeader("X-Forwarded-Host", "anotherHost"); + + HttpRequest httpRequest = new ServletServerHttpRequest(request); + UriComponents result = UriComponentsBuilder.fromHttpRequest(httpRequest).build(); + + assertEquals("http://anotherHost/mvc-showcase", result.toString()); + } + + // SPR-10701 + + @Test + public void fromHttpRequestWithForwardedHostIncludingPort() { + MockHttpServletRequest request = new MockHttpServletRequest(); + request.setScheme("http"); + request.setServerName("localhost"); + request.setServerPort(-1); + request.setRequestURI("/mvc-showcase"); + request.addHeader("X-Forwarded-Host", "webtest.foo.bar.com:443"); + + HttpRequest httpRequest = new ServletServerHttpRequest(request); + UriComponents result = UriComponentsBuilder.fromHttpRequest(httpRequest).build(); + + assertEquals("webtest.foo.bar.com", result.getHost()); + assertEquals(443, result.getPort()); + } + + // SPR-11140 + + @Test + public void fromHttpRequestWithForwardedHostMultiValuedHeader() { + MockHttpServletRequest request = new MockHttpServletRequest(); + request.setScheme("http"); + request.setServerName("localhost"); + request.setServerPort(-1); + request.addHeader("X-Forwarded-Host", "a.example.org, b.example.org, c.example.org"); + + HttpRequest httpRequest = new ServletServerHttpRequest(request); + UriComponents result = UriComponentsBuilder.fromHttpRequest(httpRequest).build(); + + assertEquals("a.example.org", result.getHost()); + assertEquals(-1, result.getPort()); + } + + // SPR-11855 + + @Test + public void fromHttpRequestWithForwardedHostAndPort() { + MockHttpServletRequest request = new MockHttpServletRequest(); + request.setScheme("http"); + request.setServerName("localhost"); + request.setServerPort(8080); + request.addHeader("X-Forwarded-Host", "foobarhost"); + request.addHeader("X-Forwarded-Port", "9090"); + + HttpRequest httpRequest = new ServletServerHttpRequest(request); + UriComponents result = UriComponentsBuilder.fromHttpRequest(httpRequest).build(); + + assertEquals("foobarhost", result.getHost()); + assertEquals(9090, result.getPort()); + } + + // SPR-11872 + + @Test + public void fromHttpRequestWithForwardedHostWithDefaultPort() { + MockHttpServletRequest request = new MockHttpServletRequest(); + request.setScheme("http"); + request.setServerName("localhost"); + request.setServerPort(10080); + request.addHeader("X-Forwarded-Host", "example.org"); + + HttpRequest httpRequest = new ServletServerHttpRequest(request); + UriComponents result = UriComponentsBuilder.fromHttpRequest(httpRequest).build(); + + assertEquals("example.org", result.getHost()); + assertEquals(-1, result.getPort()); + } + + + @Test + public void fromHttpRequestWithForwardedHostWithForwardedScheme() { + MockHttpServletRequest request = new MockHttpServletRequest(); + request.setScheme("http"); + request.setServerName("localhost"); + request.setServerPort(10080); + request.addHeader("X-Forwarded-Host", "example.org"); + request.addHeader("X-Forwarded-Proto", "https"); + + HttpRequest httpRequest = new ServletServerHttpRequest(request); + UriComponents result = UriComponentsBuilder.fromHttpRequest(httpRequest).build(); + + assertEquals("example.org", result.getHost()); + assertEquals("https", result.getScheme()); + assertEquals(-1, result.getPort()); + } + + // SPR-12771 + + @Test + public void fromHttpRequestWithForwardedProtoAndDefaultPort() { + MockHttpServletRequest request = new MockHttpServletRequest(); + request.setScheme("http"); + request.setServerName("localhost"); + request.setServerPort(80); + request.setRequestURI("/mvc-showcase"); + request.addHeader("X-Forwarded-Proto", "https"); + request.addHeader("X-Forwarded-Host", "84.198.58.199"); + request.addHeader("X-Forwarded-Port", "443"); + + HttpRequest httpRequest = new ServletServerHttpRequest(request); + UriComponents result = UriComponentsBuilder.fromHttpRequest(httpRequest).build(); + + assertEquals("https://84.198.58.199/mvc-showcase", result.toString()); + } + + + + @Test public void path() throws URISyntaxException { UriComponentsBuilder builder = UriComponentsBuilder.fromPath("/foo/bar"); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/support/ServletUriComponentsBuilderTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/support/ServletUriComponentsBuilderTests.java index 5b68caffcdd..91e402cc510 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/support/ServletUriComponentsBuilderTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/support/ServletUriComponentsBuilderTests.java @@ -21,10 +21,14 @@ import static org.junit.Assert.assertNull; import org.junit.Before; import org.junit.Test; + +import org.springframework.http.HttpRequest; +import org.springframework.http.server.ServletServerHttpRequest; import org.springframework.mock.web.test.MockHttpServletRequest; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.util.UriComponents; +import org.springframework.web.util.UriComponentsBuilder; /** * Unit tests for @@ -78,92 +82,31 @@ public class ServletUriComponentsBuilderTests { assertEquals("https://localhost:9043/mvc-showcase", result); } - @Test - public void fromRequestUri() { - this.request.setRequestURI("/mvc-showcase/data/param"); - this.request.setQueryString("foo=123"); - String result = ServletUriComponentsBuilder.fromRequestUri(this.request).build().toUriString(); - assertEquals("http://localhost/mvc-showcase/data/param", result); - } - - @Test - public void fromRequestWithForwardedHost() { - this.request.addHeader("X-Forwarded-Host", "anotherHost"); - this.request.setRequestURI("/mvc-showcase/data/param"); - this.request.setQueryString("foo=123"); - String result = ServletUriComponentsBuilder.fromRequest(this.request).build().toUriString(); - assertEquals("http://anotherHost/mvc-showcase/data/param?foo=123", result); - } - - // SPR-10701 - - @Test - public void fromRequestWithForwardedHostIncludingPort() { - this.request.addHeader("X-Forwarded-Host", "webtest.foo.bar.com:443"); - this.request.setRequestURI("/mvc-showcase/data/param"); - this.request.setQueryString("foo=123"); - UriComponents result = ServletUriComponentsBuilder.fromRequest(this.request).build(); - - assertEquals("webtest.foo.bar.com", result.getHost()); - assertEquals(443, result.getPort()); - } - - // SPR-11140 - - @Test - public void fromRequestWithForwardedHostMultiValuedHeader() { - this.request.addHeader("X-Forwarded-Host", "a.example.org, b.example.org, c.example.org"); - assertEquals("a.example.org", ServletUriComponentsBuilder.fromRequest(this.request).build().getHost()); - } - - // SPR-11855 + // Most X-Forwarded-* tests in UriComponentsBuilderTests @Test public void fromRequestWithForwardedHostAndPort() { - this.request.addHeader("X-Forwarded-Host", "foobarhost"); - this.request.addHeader("X-Forwarded-Port", "9090"); - this.request.setServerPort(8080); - UriComponents uriComponents = ServletUriComponentsBuilder.fromRequest(this.request).build(); - - assertEquals("foobarhost", uriComponents.getHost()); - assertEquals(9090, uriComponents.getPort()); - } - - // SPR-11872 - - @Test - public void fromRequestWithForwardedHostWithDefaultPort() { - this.request.setServerPort(10080); - this.request.addHeader("X-Forwarded-Host", "example.org"); - UriComponents result = ServletUriComponentsBuilder.fromRequest(this.request).build(); - - assertEquals("example.org", result.getHost()); - assertEquals("should have used the default port of the forwarded request", -1, result.getPort()); - } - - @Test - public void fromRequestWithForwardedHostWithForwardedScheme() { - this.request.setServerPort(10080); - this.request.addHeader("X-Forwarded-Proto", "https"); - this.request.addHeader("X-Forwarded-Host", "example.org"); - UriComponents result = ServletUriComponentsBuilder.fromRequest(this.request).build(); + MockHttpServletRequest request = new MockHttpServletRequest(); + request.setScheme("http"); + request.setServerName("localhost"); + request.setServerPort(80); + request.setRequestURI("/mvc-showcase"); + request.addHeader("X-Forwarded-Proto", "https"); + request.addHeader("X-Forwarded-Host", "84.198.58.199"); + request.addHeader("X-Forwarded-Port", "443"); + + HttpRequest httpRequest = new ServletServerHttpRequest(request); + UriComponents result = UriComponentsBuilder.fromHttpRequest(httpRequest).build(); - assertEquals("example.org", result.getHost()); - assertEquals("should have derived scheme from header", "https", result.getScheme()); - assertEquals("should have used the default port of the forwarded request", -1, result.getPort()); + assertEquals("https://84.198.58.199/mvc-showcase", result.toString()); } - // SPR-12771 - @Test - public void fromRequestWithForwardedProtoAndDefaultPort() { - this.request.addHeader("X-Forwarded-Proto", "https"); - this.request.addHeader("X-Forwarded-Host", "84.198.58.199"); - this.request.addHeader("X-Forwarded-Port", "443"); - this.request.setServerPort(80); - UriComponents result = ServletUriComponentsBuilder.fromRequest(this.request).build(); - - assertEquals("https://84.198.58.199/mvc-showcase", result.toString()); + public void fromRequestUri() { + this.request.setRequestURI("/mvc-showcase/data/param"); + this.request.setQueryString("foo=123"); + String result = ServletUriComponentsBuilder.fromRequestUri(this.request).build().toUriString(); + assertEquals("http://localhost/mvc-showcase/data/param", result); } @Test