Skip to content

Commit 9f4d4d1

Browse files
committed
Check X-Forwarded-Host in ServletUriComponentsBuilder
Issue: SPR-11855
1 parent c809143 commit 9f4d4d1

File tree

2 files changed

+30
-9
lines changed

2 files changed

+30
-9
lines changed

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

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2013 the original author or authors.
2+
* Copyright 2002-2014 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -97,13 +97,12 @@ public static ServletUriComponentsBuilder fromRequestUri(HttpServletRequest requ
9797
*/
9898
public static ServletUriComponentsBuilder fromRequest(HttpServletRequest request) {
9999
String scheme = request.getScheme();
100-
int port = request.getServerPort();
101100
String host = request.getServerName();
101+
int port = request.getServerPort();
102102

103-
String header = request.getHeader("X-Forwarded-Host");
104-
105-
if (StringUtils.hasText(header)) {
106-
String[] hosts = StringUtils.commaDelimitedListToStringArray(header);
103+
String hostHeader = request.getHeader("X-Forwarded-Host");
104+
if (StringUtils.hasText(hostHeader)) {
105+
String[] hosts = StringUtils.commaDelimitedListToStringArray(hostHeader);
107106
String hostToUse = hosts[0];
108107
if (hostToUse.contains(":")) {
109108
String[] hostAndPort = StringUtils.split(hostToUse, ":");
@@ -115,6 +114,11 @@ public static ServletUriComponentsBuilder fromRequest(HttpServletRequest request
115114
}
116115
}
117116

117+
String portHeader = request.getHeader("X-Forwarded-Port");
118+
if (StringUtils.hasText(portHeader)) {
119+
port = Integer.parseInt(portHeader);
120+
}
121+
118122
ServletUriComponentsBuilder builder = new ServletUriComponentsBuilder();
119123
builder.scheme(scheme);
120124
builder.host(host);

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

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2013 the original author or authors.
2+
* Copyright 2002-2014 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -24,8 +24,12 @@
2424
import org.springframework.web.util.UriComponents;
2525

2626
import static org.junit.Assert.*;
27+
import static org.junit.Assert.assertEquals;
2728

2829
/**
30+
* Unit tests for
31+
* {@link org.springframework.web.servlet.support.ServletUriComponentsBuilder}.
32+
*
2933
* @author Rossen Stoyanchev
3034
*/
3135
public class ServletUriComponentsBuilderTests {
@@ -85,7 +89,7 @@ public void fromRequestUri() {
8589
}
8690

8791
@Test
88-
public void fromRequestWithForwardedHostHeader() {
92+
public void fromRequestWithForwardedHost() {
8993
request.addHeader("X-Forwarded-Host", "anotherHost");
9094
request.setRequestURI("/mvc-showcase/data/param");
9195
request.setQueryString("foo=123");
@@ -97,7 +101,7 @@ public void fromRequestWithForwardedHostHeader() {
97101
// SPR-10701
98102

99103
@Test
100-
public void fromRequestWithForwardedHostAndPortHeader() {
104+
public void fromRequestWithForwardedHostIncludingPort() {
101105
request.addHeader("X-Forwarded-Host", "webtest.foo.bar.com:443");
102106
request.setRequestURI("/mvc-showcase/data/param");
103107
request.setQueryString("foo=123");
@@ -116,6 +120,19 @@ public void fromRequestWithForwardedHostMultiValuedHeader() {
116120
assertEquals("a.example.org", ServletUriComponentsBuilder.fromRequest(this.request).build().getHost());
117121
}
118122

123+
// SPR-11855
124+
125+
@Test
126+
public void fromRequestWithForwardedHostAndPort() {
127+
this.request.addHeader("X-Forwarded-Host", "foobarhost");
128+
this.request.addHeader("X-Forwarded-Port", "9090");
129+
this.request.setServerPort(8080);
130+
UriComponents uriComponents = ServletUriComponentsBuilder.fromRequest(this.request).build();
131+
132+
assertEquals("foobarhost", uriComponents.getHost());
133+
assertEquals(9090, uriComponents.getPort());
134+
}
135+
119136
@Test
120137
public void fromContextPath() {
121138
request.setRequestURI("/mvc-showcase/data/param");

0 commit comments

Comments
 (0)