Skip to content

Commit 69b3e00

Browse files
committed
Support comma-separated X-Forwarded-Proto
Issue: SPR-12816
1 parent c6250f5 commit 69b3e00

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed

spring-web/src/main/java/org/springframework/web/util/UriComponentsBuilder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,8 @@ public static UriComponentsBuilder fromHttpRequest(HttpRequest request) {
303303

304304
String protocolHeader = request.getHeaders().getFirst("X-Forwarded-Proto");
305305
if (StringUtils.hasText(protocolHeader)) {
306-
scheme = protocolHeader;
306+
String[] protocols = StringUtils.commaDelimitedListToStringArray(protocolHeader);
307+
scheme = protocols[0];
307308
}
308309

309310
builder.scheme(scheme);

spring-web/src/test/java/org/springframework/web/util/UriComponentsBuilderTests.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,25 @@ public void fromHttpRequestWithForwardedPortMultiValueHeader() {
417417
assertEquals("http://a.example.org/mvc-showcase", result.toString());
418418
}
419419

420+
// SPR-12816
421+
422+
@Test
423+
public void fromHttpRequestWithForwardedProtoMultiValueHeader() {
424+
MockHttpServletRequest request = new MockHttpServletRequest();
425+
request.setScheme("http");
426+
request.setServerName("localhost");
427+
request.setServerPort(8080);
428+
request.setRequestURI("/mvc-showcase");
429+
request.addHeader("X-Forwarded-Host", "a.example.org");
430+
request.addHeader("X-Forwarded-Port", "443");
431+
request.addHeader("X-Forwarded-Proto", "https,https");
432+
433+
HttpRequest httpRequest = new ServletServerHttpRequest(request);
434+
UriComponents result = UriComponentsBuilder.fromHttpRequest(httpRequest).build();
435+
436+
assertEquals("https://a.example.org/mvc-showcase", result.toString());
437+
}
438+
420439
@Test
421440
public void path() throws URISyntaxException {
422441
UriComponentsBuilder builder = UriComponentsBuilder.fromPath("/foo/bar");

0 commit comments

Comments
 (0)