From 0b1d14cdd95eb7582d19daa9f31c13b8f8bfb86d Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Fri, 16 Jul 2021 09:34:12 +0100 Subject: [PATCH] Follow-up fix, checking also "ws" and port 80 case See gh-27097 --- .../web/util/UriComponentsBuilder.java | 3 ++- .../web/util/UriComponentsBuilderTests.java | 23 ++++++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) 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 6787571c4c9..d378a36840a 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 @@ -881,7 +881,8 @@ public class UriComponentsBuilder implements UriBuilder, Cloneable { "with the removeOnly=true. Request headers: " + headers); } - if (this.scheme != null && ((this.scheme.equals("http") && "80".equals(this.port)) || + if (this.scheme != null && + (((this.scheme.equals("http") || this.scheme.equals("ws")) && "80".equals(this.port)) || ((this.scheme.equals("https") || this.scheme.equals("wss")) && "443".equals(this.port)))) { port(null); } 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 52623dacc9a..d6d971c4ed5 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 @@ -378,7 +378,7 @@ class UriComponentsBuilderTests { @ParameterizedTest // gh-17368, gh-27097 @ValueSource(strings = {"https", "wss"}) - void fromHttpRequestResetsPortBeforeSettingIt(String protocol) { + void fromHttpRequestResetsPort443(String protocol) { MockHttpServletRequest request = new MockHttpServletRequest(); request.addHeader("X-Forwarded-Proto", protocol); request.addHeader("X-Forwarded-Host", "84.198.58.199"); @@ -397,6 +397,27 @@ class UriComponentsBuilderTests { assertThat(result.getPath()).isEqualTo("/rest/mobile/users/1"); } + @ParameterizedTest // gh-27097 + @ValueSource(strings = {"http", "ws"}) + void fromHttpRequestResetsPort80(String protocol) { + MockHttpServletRequest request = new MockHttpServletRequest(); + request.addHeader("X-Forwarded-Proto", protocol); + request.addHeader("X-Forwarded-Host", "84.198.58.199"); + request.addHeader("X-Forwarded-Port", 80); + request.setScheme("http"); + request.setServerName("example.com"); + request.setServerPort(80); + request.setRequestURI("/path"); + + HttpRequest httpRequest = new ServletServerHttpRequest(request); + UriComponents result = UriComponentsBuilder.fromHttpRequest(httpRequest).build(); + + assertThat(result.getScheme()).isEqualTo(protocol); + assertThat(result.getHost()).isEqualTo("84.198.58.199"); + assertThat(result.getPort()).isEqualTo(-1); + assertThat(result.getPath()).isEqualTo("/path"); + } + @Test // SPR-14761 void fromHttpRequestWithForwardedIPv4Host() { MockHttpServletRequest request = new MockHttpServletRequest();