From 69b3e002154e0235f82784a308f2b1b782601c7f Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Fri, 13 Mar 2015 13:02:52 -0400 Subject: [PATCH] Support comma-separated X-Forwarded-Proto Issue: SPR-12816 --- .../web/util/UriComponentsBuilder.java | 3 ++- .../web/util/UriComponentsBuilderTests.java | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/spring-web/src/main/java/org/springframework/web/util/UriComponentsBuilder.java b/spring-web/src/main/java/org/springframework/web/util/UriComponentsBuilder.java index afb02aceb9..787cc6fa10 100644 --- a/spring-web/src/main/java/org/springframework/web/util/UriComponentsBuilder.java +++ b/spring-web/src/main/java/org/springframework/web/util/UriComponentsBuilder.java @@ -303,7 +303,8 @@ public class UriComponentsBuilder implements Cloneable { String protocolHeader = request.getHeaders().getFirst("X-Forwarded-Proto"); if (StringUtils.hasText(protocolHeader)) { - scheme = protocolHeader; + String[] protocols = StringUtils.commaDelimitedListToStringArray(protocolHeader); + scheme = protocols[0]; } builder.scheme(scheme); diff --git a/spring-web/src/test/java/org/springframework/web/util/UriComponentsBuilderTests.java b/spring-web/src/test/java/org/springframework/web/util/UriComponentsBuilderTests.java index a67e4158de..e76779366a 100644 --- a/spring-web/src/test/java/org/springframework/web/util/UriComponentsBuilderTests.java +++ b/spring-web/src/test/java/org/springframework/web/util/UriComponentsBuilderTests.java @@ -417,6 +417,25 @@ public class UriComponentsBuilderTests { assertEquals("http://a.example.org/mvc-showcase", result.toString()); } + // SPR-12816 + + @Test + public void fromHttpRequestWithForwardedProtoMultiValueHeader() { + MockHttpServletRequest request = new MockHttpServletRequest(); + request.setScheme("http"); + request.setServerName("localhost"); + request.setServerPort(8080); + request.setRequestURI("/mvc-showcase"); + request.addHeader("X-Forwarded-Host", "a.example.org"); + request.addHeader("X-Forwarded-Port", "443"); + request.addHeader("X-Forwarded-Proto", "https,https"); + + HttpRequest httpRequest = new ServletServerHttpRequest(request); + UriComponents result = UriComponentsBuilder.fromHttpRequest(httpRequest).build(); + + assertEquals("https://a.example.org/mvc-showcase", result.toString()); + } + @Test public void path() throws URISyntaxException { UriComponentsBuilder builder = UriComponentsBuilder.fromPath("/foo/bar");