From 567fcc41cc2f609d74db1de6b4097dd6d9acb749 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Wed, 21 Nov 2018 11:17:10 -0500 Subject: [PATCH] ForwardedHeaderTransformer handles encoding correctly Issue: SPR-17525 --- .../web/filter/reactive/ForwardedHeaderFilter.java | 2 +- .../filter/reactive/ForwardedHeaderFilterTests.java | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/spring-web/src/main/java/org/springframework/web/filter/reactive/ForwardedHeaderFilter.java b/spring-web/src/main/java/org/springframework/web/filter/reactive/ForwardedHeaderFilter.java index d48484a1aa..d185fd47fb 100644 --- a/spring-web/src/main/java/org/springframework/web/filter/reactive/ForwardedHeaderFilter.java +++ b/spring-web/src/main/java/org/springframework/web/filter/reactive/ForwardedHeaderFilter.java @@ -84,7 +84,7 @@ public class ForwardedHeaderFilter implements WebFilter { return chain.filter(withoutForwardHeaders); } else { - URI uri = UriComponentsBuilder.fromHttpRequest(exchange.getRequest()).build().toUri(); + URI uri = UriComponentsBuilder.fromHttpRequest(exchange.getRequest()).build(true).toUri(); String prefix = getForwardedPrefix(exchange.getRequest().getHeaders()); ServerWebExchange withChangedUri = exchange.mutate() diff --git a/spring-web/src/test/java/org/springframework/web/filter/reactive/ForwardedHeaderFilterTests.java b/spring-web/src/test/java/org/springframework/web/filter/reactive/ForwardedHeaderFilterTests.java index 3ec757d185..3c73d6b8aa 100644 --- a/spring-web/src/test/java/org/springframework/web/filter/reactive/ForwardedHeaderFilterTests.java +++ b/spring-web/src/test/java/org/springframework/web/filter/reactive/ForwardedHeaderFilterTests.java @@ -23,6 +23,7 @@ import org.junit.Test; import reactor.core.publisher.Mono; import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; import org.springframework.lang.Nullable; import org.springframework.mock.http.server.reactive.test.MockServerHttpRequest; import org.springframework.mock.web.test.server.MockServerWebExchange; @@ -113,6 +114,18 @@ public class ForwardedHeaderFilterTests { assertEquals(new URI("http://example.com/prefix/path"), uri); } + @Test // SPR-17525 + public void shouldNotDoubleEncode() throws Exception { + MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest + .method(HttpMethod.GET, new URI ("http://example.com/a%20b?q=a%2Bb")) + .header("Forwarded", "host=84.198.58.199;proto=https")); + + this.filter.filter(exchange, this.filterChain).block(Duration.ZERO); + + URI uri = this.filterChain.uri; + assertEquals(new URI("https://84.198.58.199/a%20b?q=a%2Bb"), uri); + } + private static class TestWebFilterChain implements WebFilterChain {