From 236981aaa99e1b8f4546935e74dc98660d8a6b83 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Tue, 3 Dec 2013 09:55:47 -0500 Subject: [PATCH] Support multi-value x-forwarded-host header Issue: SPR-11140 --- .../servlet/support/ServletUriComponentsBuilder.java | 12 +++++++----- .../support/ServletUriComponentsBuilderTests.java | 9 +++++++++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/ServletUriComponentsBuilder.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/ServletUriComponentsBuilder.java index bda44896e07..fa8aedab16c 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/ServletUriComponentsBuilder.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/ServletUriComponentsBuilder.java @@ -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; } } 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 b7cf39d9f0c..508c4a24480 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 @@ -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");