Merge pull request #1413 from gvdenbro/forwarded-header-server-port-fix
This commit is contained in:
@@ -717,7 +717,7 @@ public class UriComponentsBuilder implements UriBuilder, Cloneable {
|
||||
String forwardedToUse = StringUtils.tokenizeToStringArray(forwardedHeader, ",")[0];
|
||||
Matcher matcher = FORWARDED_HOST_PATTERN.matcher(forwardedToUse);
|
||||
if (matcher.find()) {
|
||||
host(matcher.group(1).trim());
|
||||
adaptForwardedHost(matcher.group(1).trim());
|
||||
}
|
||||
matcher = FORWARDED_PROTO_PATTERN.matcher(forwardedToUse);
|
||||
if (matcher.find()) {
|
||||
@@ -727,16 +727,7 @@ public class UriComponentsBuilder implements UriBuilder, Cloneable {
|
||||
else {
|
||||
String hostHeader = headers.getFirst("X-Forwarded-Host");
|
||||
if (StringUtils.hasText(hostHeader)) {
|
||||
String hostToUse = StringUtils.tokenizeToStringArray(hostHeader, ",")[0];
|
||||
int portSeparatorIdx = hostToUse.lastIndexOf(":");
|
||||
if (portSeparatorIdx > hostToUse.lastIndexOf("]")) {
|
||||
host(hostToUse.substring(0, portSeparatorIdx));
|
||||
port(Integer.parseInt(hostToUse.substring(portSeparatorIdx + 1)));
|
||||
}
|
||||
else {
|
||||
host(hostToUse);
|
||||
port(null);
|
||||
}
|
||||
adaptForwardedHost(StringUtils.tokenizeToStringArray(hostHeader, ",")[0]);
|
||||
}
|
||||
|
||||
String portHeader = headers.getFirst("X-Forwarded-Port");
|
||||
@@ -758,6 +749,18 @@ public class UriComponentsBuilder implements UriBuilder, Cloneable {
|
||||
return this;
|
||||
}
|
||||
|
||||
private void adaptForwardedHost(String hostToUse) {
|
||||
int portSeparatorIdx = hostToUse.lastIndexOf(":");
|
||||
if (portSeparatorIdx > hostToUse.lastIndexOf("]")) {
|
||||
host(hostToUse.substring(0, portSeparatorIdx));
|
||||
port(Integer.parseInt(hostToUse.substring(portSeparatorIdx + 1)));
|
||||
}
|
||||
else {
|
||||
host(hostToUse);
|
||||
port(null);
|
||||
}
|
||||
}
|
||||
|
||||
private void resetHierarchicalComponents() {
|
||||
this.userInfo = null;
|
||||
this.host = null;
|
||||
|
||||
@@ -790,4 +790,59 @@ public class UriComponentsBuilderTests {
|
||||
assertEquals("/rest/mobile/users/1", result.getPath());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void fromHttpRequestForwardedHeaderWithHostPortAndWithoutServerPort() throws Exception {
|
||||
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 fromHttpRequestForwardedHeaderWithHostPortAndServerPort() throws Exception {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
request.addHeader("Forwarded", "proto=https; host=84.198.58.199:9090");
|
||||
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(9090, result.getPort());
|
||||
assertEquals("https://84.198.58.199:9090/rest/mobile/users/1", result.toUriString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void fromHttpRequestForwardedHeaderWithoutHostPortAndWithServerPort() throws Exception {
|
||||
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());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user