Skip to content

Commit 236981a

Browse files
committed
Support multi-value x-forwarded-host header
Issue: SPR-11140
1 parent 6ce2eb9 commit 236981a

File tree

2 files changed

+16
-5
lines changed

2 files changed

+16
-5
lines changed

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

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -96,16 +96,18 @@ public static ServletUriComponentsBuilder fromRequest(HttpServletRequest request
9696
int port = request.getServerPort();
9797
String host = request.getServerName();
9898

99-
String xForwardedHostHeader = request.getHeader("X-Forwarded-Host");
99+
String header = request.getHeader("X-Forwarded-Host");
100100

101-
if (StringUtils.hasText(xForwardedHostHeader)) {
102-
if (StringUtils.countOccurrencesOf(xForwardedHostHeader, ":") == 1) {
103-
String[] hostAndPort = StringUtils.split(xForwardedHostHeader, ":");
101+
if (StringUtils.hasText(header)) {
102+
String[] hosts = StringUtils.commaDelimitedListToStringArray(header);
103+
String hostToUse = hosts[0];
104+
if (hostToUse.contains(":")) {
105+
String[] hostAndPort = StringUtils.split(hostToUse, ":");
104106
host = hostAndPort[0];
105107
port = Integer.parseInt(hostAndPort[1]);
106108
}
107109
else {
108-
host = xForwardedHostHeader;
110+
host = hostToUse;
109111
}
110112
}
111113

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,15 @@ public void fromRequestWithForwardedHostAndPortHeader() {
107107
assertEquals(443, result.getPort());
108108
}
109109

110+
// SPR-11140
111+
112+
@Test
113+
public void fromRequestWithForwardedHostMultiValuedHeader() {
114+
this.request.addHeader("X-Forwarded-Host", "a.example.org, b.example.org, c.example.org");
115+
116+
assertEquals("a.example.org", ServletUriComponentsBuilder.fromRequest(this.request).build().getHost());
117+
}
118+
110119
@Test
111120
public void fromContextPath() {
112121
request.setRequestURI("/mvc-showcase/data/param");

0 commit comments

Comments
 (0)