Browse Source

Support multi-value x-forwarded-host header

Issue: SPR-11140
pull/439/head
Rossen Stoyanchev 12 years ago
parent
commit
236981aaa9
  1. 12
      spring-webmvc/src/main/java/org/springframework/web/servlet/support/ServletUriComponentsBuilder.java
  2. 9
      spring-webmvc/src/test/java/org/springframework/web/servlet/support/ServletUriComponentsBuilderTests.java

12
spring-webmvc/src/main/java/org/springframework/web/servlet/support/ServletUriComponentsBuilder.java

@ -96,16 +96,18 @@ public class ServletUriComponentsBuilder extends UriComponentsBuilder { @@ -96,16 +96,18 @@ public class ServletUriComponentsBuilder extends UriComponentsBuilder {
int port = request.getServerPort();
String host = request.getServerName();
String xForwardedHostHeader = request.getHeader("X-Forwarded-Host");
String header = request.getHeader("X-Forwarded-Host");
if (StringUtils.hasText(xForwardedHostHeader)) {
if (StringUtils.countOccurrencesOf(xForwardedHostHeader, ":") == 1) {
String[] hostAndPort = StringUtils.split(xForwardedHostHeader, ":");
if (StringUtils.hasText(header)) {
String[] hosts = StringUtils.commaDelimitedListToStringArray(header);
String hostToUse = hosts[0];
if (hostToUse.contains(":")) {
String[] hostAndPort = StringUtils.split(hostToUse, ":");
host = hostAndPort[0];
port = Integer.parseInt(hostAndPort[1]);
}
else {
host = xForwardedHostHeader;
host = hostToUse;
}
}

9
spring-webmvc/src/test/java/org/springframework/web/servlet/support/ServletUriComponentsBuilderTests.java

@ -107,6 +107,15 @@ public class ServletUriComponentsBuilderTests { @@ -107,6 +107,15 @@ public class ServletUriComponentsBuilderTests {
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());
}
@Test
public void fromContextPath() {
request.setRequestURI("/mvc-showcase/data/param");

Loading…
Cancel
Save