Skip to content

Commit 567fcc4

Browse files
committed
ForwardedHeaderTransformer handles encoding correctly
Issue: SPR-17525
1 parent 97dac8a commit 567fcc4

File tree

2 files changed

+14
-1
lines changed

2 files changed

+14
-1
lines changed

spring-web/src/main/java/org/springframework/web/filter/reactive/ForwardedHeaderFilter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
8484
return chain.filter(withoutForwardHeaders);
8585
}
8686
else {
87-
URI uri = UriComponentsBuilder.fromHttpRequest(exchange.getRequest()).build().toUri();
87+
URI uri = UriComponentsBuilder.fromHttpRequest(exchange.getRequest()).build(true).toUri();
8888
String prefix = getForwardedPrefix(exchange.getRequest().getHeaders());
8989

9090
ServerWebExchange withChangedUri = exchange.mutate()

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import reactor.core.publisher.Mono;
2424

2525
import org.springframework.http.HttpHeaders;
26+
import org.springframework.http.HttpMethod;
2627
import org.springframework.lang.Nullable;
2728
import org.springframework.mock.http.server.reactive.test.MockServerHttpRequest;
2829
import org.springframework.mock.web.test.server.MockServerWebExchange;
@@ -113,6 +114,18 @@ public void requestUriWithForwardedPrefixTrailingSlash() throws Exception {
113114
assertEquals(new URI("http://example.com/prefix/path"), uri);
114115
}
115116

117+
@Test // SPR-17525
118+
public void shouldNotDoubleEncode() throws Exception {
119+
MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest
120+
.method(HttpMethod.GET, new URI ("http://example.com/a%20b?q=a%2Bb"))
121+
.header("Forwarded", "host=84.198.58.199;proto=https"));
122+
123+
this.filter.filter(exchange, this.filterChain).block(Duration.ZERO);
124+
125+
URI uri = this.filterChain.uri;
126+
assertEquals(new URI("https://84.198.58.199/a%20b?q=a%2Bb"), uri);
127+
}
128+
116129

117130
private static class TestWebFilterChain implements WebFilterChain {
118131

0 commit comments

Comments
 (0)