ForwardedHeaderExtractingRequest(HttpServletRequest request, UrlPathHelper pathHelper) { super(request); HttpRequest httpRequest = new ServletServerHttpRequest(request); UriComponents uriComponents = UriComponentsBuilder.fromHttpRequest(httpRequest).build(); int port = uriComponents.getPort(); this.scheme = uriComponents.getScheme(); this.secure = "https".equals(this.scheme); this.host = uriComponents.getHost(); this.port = (port == -1 ? (this.secure ? 443 : 80) : port); String baseUrl = this.scheme + "://" + this.host + (port == -1 ? "" : ":" + port); Supplier<HttpServletRequest> delegateRequest = () -> (HttpServletRequest) getRequest(); this.forwardedPrefixExtractor = new ForwardedPrefixExtractor(delegateRequest, pathHelper, baseUrl); }
@Test // SPR-10539 public void fromUriStringIPv6Host() { UriComponents result = UriComponentsBuilder .fromUriString("http://[1abc:2abc:3abc::5ABC:6abc]:8080/resource").build().encode(); assertEquals("[1abc:2abc:3abc::5ABC:6abc]", result.getHost()); UriComponents resultWithScopeId = UriComponentsBuilder .fromUriString("http://[1abc:2abc:3abc::5ABC:6abc%eth0]:8080/resource").build().encode(); assertEquals("[1abc:2abc:3abc::5ABC:6abc%25eth0]", resultWithScopeId.getHost()); UriComponents resultIPv4compatible = UriComponentsBuilder .fromUriString("http://[::192.168.1.1]:8080/resource").build().encode(); assertEquals("[::192.168.1.1]", resultIPv4compatible.getHost()); }
@Test public void fromHierarchicalUri() throws URISyntaxException { URI uri = new URI("http://example.com/foo?bar#baz"); UriComponents result = UriComponentsBuilder.fromUri(uri).build(); assertEquals("http", result.getScheme()); assertEquals("example.com", result.getHost()); assertEquals("/foo", result.getPath()); assertEquals("bar", result.getQuery()); assertEquals("baz", result.getFragment()); assertEquals("Invalid result URI", uri, result.toUri()); }
@Test // SPR-11970 public void fromUriStringNoPathWithReservedCharInQuery() { UriComponents result = UriComponentsBuilder.fromUriString("http://example.com?foo=bar@baz").build(); assertTrue(StringUtils.isEmpty(result.getUserInfo())); assertEquals("example.com", result.getHost()); assertTrue(result.getQueryParams().containsKey("foo")); assertEquals("bar@baz", result.getQueryParams().getFirst("foo")); }
@Test // SPR-11140 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()); }
@Test // SPR-11872 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 plain() throws URISyntaxException { UriComponentsBuilder builder = UriComponentsBuilder.newInstance(); UriComponents result = builder.scheme("http").host("example.com") .path("foo").queryParam("bar").fragment("baz") .build(); assertEquals("http", result.getScheme()); assertEquals("example.com", result.getHost()); assertEquals("foo", result.getPath()); assertEquals("bar", result.getQuery()); assertEquals("baz", result.getFragment()); URI expected = new URI("http://example.com/foo?bar#baz"); assertEquals("Invalid result URI", expected, result.toUri()); }
@Test // SPR-10701 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()); }
@Test // SPR-11855 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()); }
@Test // SPR-16863 public void fromHttpRequestWithForwardedSsl() { MockHttpServletRequest request = new MockHttpServletRequest(); request.setScheme("http"); request.setServerName("example.org"); request.setServerPort(10080); request.addHeader("X-Forwarded-Ssl", "on"); HttpRequest httpRequest = new ServletServerHttpRequest(request); UriComponents result = UriComponentsBuilder.fromHttpRequest(httpRequest).build(); assertEquals("https", result.getScheme()); assertEquals("example.org", result.getHost()); assertEquals(-1, result.getPort()); }
@Test // SPR-11856 public void fromHttpRequestForwardedHeader() { MockHttpServletRequest request = new MockHttpServletRequest(); request.addHeader("Forwarded", "proto=https; host=84.198.58.199"); request.setScheme("http"); request.setServerName("example.com"); request.setRequestURI("/rest/mobile/users/1"); HttpRequest httpRequest = new ServletServerHttpRequest(request); UriComponents result = UriComponentsBuilder.fromHttpRequest(httpRequest).build(); assertEquals("https", result.getScheme()); assertEquals("84.198.58.199", result.getHost()); assertEquals("/rest/mobile/users/1", result.getPath()); }
@Test public void fromHttpRequestMultipleForwardedHeaderComma() { MockHttpServletRequest request = new MockHttpServletRequest(); request.addHeader("Forwarded", "host=84.198.58.199 ;proto=https, proto=ftp; host=1.2.3.4"); request.setScheme("http"); request.setServerName("example.com"); request.setRequestURI("/rest/mobile/users/1"); HttpRequest httpRequest = new ServletServerHttpRequest(request); UriComponents result = UriComponentsBuilder.fromHttpRequest(httpRequest).build(); assertEquals("https", result.getScheme()); assertEquals("84.198.58.199", result.getHost()); assertEquals("/rest/mobile/users/1", result.getPath()); }
@Test // SPR-16262 public void fromHttpRequestWithForwardedProtoWithDefaultPort() { MockHttpServletRequest request = new MockHttpServletRequest(); request.setScheme("http"); request.setServerName("example.org"); request.setServerPort(10080); request.addHeader("X-Forwarded-Proto", "https"); HttpRequest httpRequest = new ServletServerHttpRequest(request); UriComponents result = UriComponentsBuilder.fromHttpRequest(httpRequest).build(); assertEquals("https", result.getScheme()); assertEquals("example.org", result.getHost()); assertEquals(-1, result.getPort()); }
@Test public void fromHttpRequestForwardedHeaderQuoted() { MockHttpServletRequest request = new MockHttpServletRequest(); request.addHeader("Forwarded", "proto=\"https\"; host=\"84.198.58.199\""); request.setScheme("http"); request.setServerName("example.com"); request.setRequestURI("/rest/mobile/users/1"); HttpRequest httpRequest = new ServletServerHttpRequest(request); UriComponents result = UriComponentsBuilder.fromHttpRequest(httpRequest).build(); assertEquals("https", result.getScheme()); assertEquals("84.198.58.199", result.getHost()); assertEquals("/rest/mobile/users/1", result.getPath()); }
@Test public void fromHttpRequestMultipleForwardedHeader() { MockHttpServletRequest request = new MockHttpServletRequest(); request.addHeader("Forwarded", "host=84.198.58.199;proto=https"); request.addHeader("Forwarded", "proto=ftp; host=1.2.3.4"); request.setScheme("http"); request.setServerName("example.com"); request.setRequestURI("/rest/mobile/users/1"); HttpRequest httpRequest = new ServletServerHttpRequest(request); UriComponents result = UriComponentsBuilder.fromHttpRequest(httpRequest).build(); assertEquals("https", result.getScheme()); assertEquals("84.198.58.199", result.getHost()); assertEquals("/rest/mobile/users/1", result.getPath()); }
@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()); }
@Test public void fromHttpRequestForwardedHeaderWithHostPortAndWithoutServerPort() { MockHttpServletRequest request = new MockHttpServletRequest(); request.addHeader("Forwarded", "proto=https; host=84.198.58.199:9090"); request.setScheme("http"); request.setServerName("example.com"); request.setRequestURI("/rest/mobile/users/1"); HttpRequest httpRequest = new ServletServerHttpRequest(request); UriComponents result = UriComponentsBuilder.fromHttpRequest(httpRequest).build(); assertEquals("https", result.getScheme()); assertEquals("84.198.58.199", result.getHost()); assertEquals("/rest/mobile/users/1", result.getPath()); assertEquals(9090, result.getPort()); assertEquals("https://84.198.58.199:9090/rest/mobile/users/1", result.toUriString()); }
@Test public void fromHttpRequestForwardedHeaderWithoutHostPortAndWithServerPort() { MockHttpServletRequest request = new MockHttpServletRequest(); request.addHeader("Forwarded", "proto=https; host=84.198.58.199"); request.setScheme("http"); request.setServerPort(8080); request.setServerName("example.com"); request.setRequestURI("/rest/mobile/users/1"); HttpRequest httpRequest = new ServletServerHttpRequest(request); UriComponents result = UriComponentsBuilder.fromHttpRequest(httpRequest).build(); assertEquals("https", result.getScheme()); assertEquals("84.198.58.199", result.getHost()); assertEquals("/rest/mobile/users/1", result.getPath()); assertEquals(-1, result.getPort()); assertEquals("https://84.198.58.199/rest/mobile/users/1", result.toUriString()); }
@Test public void fromHttpRequest() { MockHttpServletRequest request = new MockHttpServletRequest(); request.setScheme("http"); request.setServerName("localhost"); request.setServerPort(-1); request.setRequestURI("/path"); request.setQueryString("a=1"); UriComponents result = UriComponentsBuilder.fromHttpRequest(new ServletServerHttpRequest(request)).build(); assertEquals("http", result.getScheme()); assertEquals("localhost", result.getHost()); assertEquals(-1, result.getPort()); assertEquals("/path", result.getPath()); assertEquals("a=1", result.getQuery()); }
@Test // SPR-16262 public void fromHttpRequestForwardedHeaderWithProtoAndServerPort() { MockHttpServletRequest request = new MockHttpServletRequest(); request.addHeader("Forwarded", "proto=https"); request.setScheme("http"); request.setServerPort(8080); request.setServerName("example.com"); request.setRequestURI("/rest/mobile/users/1"); HttpRequest httpRequest = new ServletServerHttpRequest(request); UriComponents result = UriComponentsBuilder.fromHttpRequest(httpRequest).build(); assertEquals("https", result.getScheme()); assertEquals("example.com", result.getHost()); assertEquals("/rest/mobile/users/1", result.getPath()); assertEquals(-1, result.getPort()); assertEquals("https://example.com/rest/mobile/users/1", result.toUriString()); }