Skip to content

Commit 7e9857a

Browse files
committed
ForwardedHeaderTransformer handles encoding correctly
Issue: SPR-17525
1 parent 0134c9d commit 7e9857a

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

spring-web/src/main/java/org/springframework/web/server/adapter/ForwardedHeaderTransformer.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.Set;
2323
import java.util.function.Function;
2424

25+
import org.springframework.context.ApplicationContext;
2526
import org.springframework.http.HttpHeaders;
2627
import org.springframework.http.server.reactive.ServerHttpRequest;
2728
import org.springframework.lang.Nullable;
@@ -36,6 +37,12 @@
3637
* <p>Alternatively if {@link #setRemoveOnly removeOnly} is set to "true",
3738
* then "Forwarded" and "X-Forwarded-*" headers are only removed, and not used.
3839
*
40+
* <p>An instance of this class is typically declared as a bean with the name
41+
* "forwardedHeaderTransformer" and detected by
42+
* {@link WebHttpHandlerBuilder#applicationContext(ApplicationContext)}, or it
43+
* can also be registered directly via
44+
* {@link WebHttpHandlerBuilder#forwardedHeaderTransformer(ForwardedHeaderTransformer)}.
45+
*
3946
* @author Rossen Stoyanchev
4047
* @since 5.1
4148
* @see <a href="https://tools.ietf.org/html/rfc7239">https://tools.ietf.org/html/rfc7239</a>
@@ -85,7 +92,7 @@ public ServerHttpRequest apply(ServerHttpRequest request) {
8592
if (hasForwardedHeaders(request)) {
8693
ServerHttpRequest.Builder builder = request.mutate();
8794
if (!this.removeOnly) {
88-
URI uri = UriComponentsBuilder.fromHttpRequest(request).build().toUri();
95+
URI uri = UriComponentsBuilder.fromHttpRequest(request).build(true).toUri();
8996
builder.uri(uri);
9097
String prefix = getForwardedPrefix(request);
9198
if (prefix != null) {

spring-web/src/test/java/org/springframework/web/server/adapter/ForwardedHeaderTransformerTests.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.junit.Test;
2222

2323
import org.springframework.http.HttpHeaders;
24+
import org.springframework.http.HttpMethod;
2425
import org.springframework.http.server.reactive.ServerHttpRequest;
2526
import org.springframework.mock.http.server.reactive.test.MockServerHttpRequest;
2627

@@ -100,6 +101,23 @@ public void xForwardedPrefixTrailingSlash() throws Exception {
100101
assertForwardedHeadersRemoved(request);
101102
}
102103

104+
@Test // SPR-17525
105+
public void shouldNotDoubleEncode() throws Exception {
106+
HttpHeaders headers = new HttpHeaders();
107+
headers.add("Forwarded", "host=84.198.58.199;proto=https");
108+
109+
ServerHttpRequest request = MockServerHttpRequest
110+
.method(HttpMethod.GET, new URI("http://example.com/a%20b?q=a%2Bb"))
111+
.headers(headers)
112+
.build();
113+
114+
request = this.requestMutator.apply(request);
115+
116+
assertEquals(new URI("https://84.198.58.199/a%20b?q=a%2Bb"), request.getURI());
117+
assertForwardedHeadersRemoved(request);
118+
}
119+
120+
103121
private MockServerHttpRequest getRequest(HttpHeaders headers) {
104122
return MockServerHttpRequest.get(BASE_URL).headers(headers).build();
105123
}

0 commit comments

Comments
 (0)