Skip to content

Commit 3eac2dd

Browse files
committed
Support X-Forwarded-Ssl
Issue: SPR-16863
1 parent 85e8634 commit 3eac2dd

File tree

3 files changed

+30
-1
lines changed

3 files changed

+30
-1
lines changed

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -743,6 +743,10 @@ UriComponentsBuilder adaptFromForwardedHeaders(HttpHeaders headers) {
743743
scheme(matcher.group(1).trim());
744744
port(null);
745745
}
746+
else if (isForwardedSslOn(headers)) {
747+
scheme("https");
748+
port(null);
749+
}
746750
matcher = FORWARDED_HOST_PATTERN.matcher(forwardedToUse);
747751
if (matcher.find()) {
748752
adaptForwardedHost(matcher.group(1).trim());
@@ -754,6 +758,10 @@ UriComponentsBuilder adaptFromForwardedHeaders(HttpHeaders headers) {
754758
scheme(StringUtils.tokenizeToStringArray(protocolHeader, ",")[0]);
755759
port(null);
756760
}
761+
else if (isForwardedSslOn(headers)) {
762+
scheme("https");
763+
port(null);
764+
}
757765

758766
String hostHeader = headers.getFirst("X-Forwarded-Host");
759767
if (StringUtils.hasText(hostHeader)) {
@@ -780,6 +788,11 @@ UriComponentsBuilder adaptFromForwardedHeaders(HttpHeaders headers) {
780788
return this;
781789
}
782790

791+
private boolean isForwardedSslOn(HttpHeaders headers) {
792+
String forwardedSsl = headers.getFirst("X-Forwarded-Ssl");
793+
return StringUtils.hasText(forwardedSsl) && forwardedSsl.equalsIgnoreCase("on");
794+
}
795+
783796
private void adaptForwardedHost(String hostToUse) {
784797
int portSeparatorIdx = hostToUse.lastIndexOf(':');
785798
if (portSeparatorIdx > hostToUse.lastIndexOf(']')) {

spring-web/src/test/java/org/springframework/web/filter/ForwardedHeaderFilterTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.springframework.mock.web.test.MockHttpServletResponse;
3434

3535
import static org.junit.Assert.*;
36+
import static org.mockito.Mockito.*;
3637

3738
/**
3839
* Unit tests for {@link ForwardedHeaderFilter}.
@@ -458,7 +459,7 @@ protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res,
458459
};
459460

460461
MockHttpServletResponse response = new MockHttpServletResponse();
461-
FilterChain filterChain = new MockFilterChain(new HttpServlet() {}, this.filter, filter);
462+
FilterChain filterChain = new MockFilterChain(mock(HttpServlet.class), this.filter, filter);
462463
filterChain.doFilter(request, response);
463464

464465
return response.getRedirectedUrl();

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,21 @@ public void fromHttpRequestWithForwardedProtoWithDefaultPort() {
426426
assertEquals(-1, result.getPort());
427427
}
428428

429+
@Test // SPR-16863
430+
public void fromHttpRequestWithForwardedSsl() {
431+
MockHttpServletRequest request = new MockHttpServletRequest();
432+
request.setScheme("http");
433+
request.setServerName("example.org");
434+
request.setServerPort(10080);
435+
request.addHeader("X-Forwarded-Ssl", "on");
436+
437+
HttpRequest httpRequest = new ServletServerHttpRequest(request);
438+
UriComponents result = UriComponentsBuilder.fromHttpRequest(httpRequest).build();
439+
440+
assertEquals("https", result.getScheme());
441+
assertEquals("example.org", result.getHost());
442+
assertEquals(-1, result.getPort());
443+
}
429444

430445
@Test
431446
public void fromHttpRequestWithForwardedHostWithForwardedScheme() {

0 commit comments

Comments
 (0)