Skip to content

Commit e5f4cb6

Browse files
committed
Merge pull request #1297 from eiiches/SPR-15140
2 parents 88c5f59 + 9819558 commit e5f4cb6

File tree

7 files changed

+54
-35
lines changed

7 files changed

+54
-35
lines changed

spring-web-reactive/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingIntegrationTests.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,12 @@ public void handleWithParam() throws Exception {
6060
assertEquals(expected, performGet("/param?name=George", new HttpHeaders(), String.class).getBody());
6161
}
6262

63+
@Test // SPR-15140
64+
public void handleWithEncodedParam() throws Exception {
65+
String expected = "Hello ++\u00e0!";
66+
assertEquals(expected, performGet("/param?name=%20%2B+%C3%A0", new HttpHeaders(), String.class).getBody());
67+
}
68+
6369
@Test
6470
public void longStreamResult() throws Exception {
6571
String[] expected = {"0", "1", "2", "3", "4"};

spring-web/src/main/java/org/springframework/http/server/reactive/AbstractServerHttpRequest.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.http.server.reactive;
1818

1919
import java.net.URI;
20+
import java.nio.charset.StandardCharsets;
2021
import java.util.regex.Matcher;
2122
import java.util.regex.Pattern;
2223

@@ -26,6 +27,7 @@
2627
import org.springframework.util.LinkedMultiValueMap;
2728
import org.springframework.util.MultiValueMap;
2829
import org.springframework.util.StringUtils;
30+
import org.springframework.web.util.UriUtils;
2931

3032
/**
3133
* Common base class for {@link ServerHttpRequest} implementations.
@@ -94,12 +96,16 @@ protected MultiValueMap<String, String> initQueryParams() {
9496
String eq = matcher.group(2);
9597
String value = matcher.group(3);
9698
value = (value != null ? value : (StringUtils.hasLength(eq) ? "" : null));
97-
queryParams.add(name, value);
99+
queryParams.add(decodeQueryParam(name), decodeQueryParam(value));
98100
}
99101
}
100102
return queryParams;
101103
}
102104

105+
private static String decodeQueryParam(String value) {
106+
return (value != null ? UriUtils.decode(value, StandardCharsets.UTF_8) : null);
107+
}
108+
103109
@Override
104110
public MultiValueMap<String, HttpCookie> getCookies() {
105111
if (this.cookies == null) {

spring-web/src/main/java/org/springframework/http/server/reactive/ReactorServerHttpRequest.java

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -56,20 +56,17 @@ public ReactorServerHttpRequest(HttpServerRequest request, NettyDataBufferFactor
5656

5757
private static URI initUri(HttpServerRequest channel) {
5858
Assert.notNull("'channel' must not be null");
59+
InetSocketAddress address = channel.remoteAddress();
60+
return (address == null ? URI.create(channel.uri()) : getBaseUrl(address).resolve(channel.uri()));
61+
}
62+
63+
private static URI getBaseUrl(InetSocketAddress address) {
5964
try {
60-
URI uri = new URI(channel.uri());
61-
InetSocketAddress remoteAddress = channel.remoteAddress();
62-
return new URI(
63-
uri.getScheme(),
64-
uri.getUserInfo(),
65-
(remoteAddress != null ? remoteAddress.getHostString() : null),
66-
(remoteAddress != null ? remoteAddress.getPort() : -1),
67-
uri.getPath(),
68-
uri.getQuery(),
69-
uri.getFragment());
65+
return new URI(null, null, address.getHostString(), address.getPort(), null, null, null);
7066
}
7167
catch (URISyntaxException ex) {
72-
throw new IllegalStateException("Could not get URI: " + ex.getMessage(), ex);
68+
// Should not happen...
69+
throw new IllegalStateException(ex);
7370
}
7471
}
7572

spring-web/src/main/java/org/springframework/http/server/reactive/RxNettyServerHttpRequest.java

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -63,25 +63,20 @@ public RxNettyServerHttpRequest(HttpServerRequest<ByteBuf> request,
6363

6464
private static URI initUri(HttpServerRequest<ByteBuf> request) {
6565
Assert.notNull("'request', request must not be null");
66+
return StringUtils.isEmpty(request.getHostHeader()) ?
67+
URI.create(request.getUri()) : getBaseUrl(request).resolve(request.getUri());
68+
}
69+
70+
private static URI getBaseUrl(HttpServerRequest<ByteBuf> request) {
71+
HttpHeaders headers = new HttpHeaders();
72+
headers.add("Host", request.getHostHeader());
73+
InetSocketAddress address = headers.getHost();
6674
try {
67-
URI uri = new URI(request.getUri());
68-
InetSocketAddress remoteAddress = null;
69-
if (!StringUtils.isEmpty(request.getHostHeader())) {
70-
HttpHeaders headers = new HttpHeaders();
71-
headers.add("Host", request.getHostHeader());
72-
remoteAddress = headers.getHost();
73-
}
74-
return new URI(
75-
uri.getScheme(),
76-
uri.getUserInfo(),
77-
(remoteAddress != null ? remoteAddress.getHostString() : null),
78-
(remoteAddress != null ? remoteAddress.getPort() : -1),
79-
uri.getPath(),
80-
uri.getQuery(),
81-
uri.getFragment());
75+
return new URI(null, null, address.getHostString(), address.getPort(), null, null, null);
8276
}
8377
catch (URISyntaxException ex) {
84-
throw new IllegalStateException("Could not get URI: " + ex.getMessage(), ex);
78+
// Should not happen...
79+
throw new IllegalStateException(ex);
8580
}
8681
}
8782

spring-web/src/main/java/org/springframework/http/server/reactive/UndertowServerHttpRequest.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,19 @@ public UndertowServerHttpRequest(HttpServerExchange exchange, DataBufferFactory
6363

6464
private static URI initUri(HttpServerExchange exchange) {
6565
Assert.notNull(exchange, "HttpServerExchange is required.");
66+
String requestURI = exchange.getRequestURI();
67+
String query = exchange.getQueryString();
68+
String requestUriAndQuery = StringUtils.isEmpty(query) ? requestURI : requestURI + "?" + query;
69+
return (exchange.isHostIncludedInRequestURI()) ?
70+
URI.create(requestUriAndQuery) : getBaseUri(exchange).resolve(requestUriAndQuery);
71+
}
72+
73+
private static URI getBaseUri(HttpServerExchange exchange) {
6674
try {
67-
String query = exchange.getQueryString();
68-
return new URI(exchange.getRequestScheme(), null,
69-
exchange.getHostName(), exchange.getHostPort(),
70-
exchange.getRequestURI(), StringUtils.hasText(query) ? query : null, null);
75+
String scheme = exchange.getRequestScheme();
76+
String host = exchange.getHostName();
77+
int port = exchange.getHostPort();
78+
return new URI(scheme, null, host, port, null, null, null);
7179
}
7280
catch (URISyntaxException ex) {
7381
throw new IllegalStateException("Could not get URI: " + ex.getMessage(), ex);

spring-web/src/test/java/org/springframework/http/server/reactive/ServerHttpRequestIntegrationTests.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@ protected CheckRequestHandler createHttpHandler() {
3636

3737
@Test
3838
public void checkUri() throws Exception {
39-
RestTemplate restTemplate = new RestTemplate();
40-
RequestEntity<Void> request = RequestEntity.post(new URI("http://localhost:" + port + "/foo?param=bar")).build();
41-
ResponseEntity<Void> response = restTemplate.exchange(request, Void.class);
39+
URI url = new URI("http://localhost:" + port + "/foo?param=bar");
40+
RequestEntity<Void> request = RequestEntity.post(url).build();
41+
ResponseEntity<Void> response = new RestTemplate().exchange(request, Void.class);
4242
assertEquals(HttpStatus.OK, response.getStatusCode());
4343
}
4444

spring-web/src/test/java/org/springframework/http/server/reactive/ServerHttpRequestTests.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,13 @@ public void queryParamsWithMulitpleValues() throws Exception {
6464
assertEquals(Arrays.asList("1", "2"), params.get("a"));
6565
}
6666

67+
@Test // SPR-15140
68+
public void queryParamsWithEncodedValue() throws Exception {
69+
MultiValueMap<String, String> params = createHttpRequest("/path?a=%20%2B+%C3%A0").getQueryParams();
70+
assertEquals(1, params.size());
71+
assertEquals(Collections.singletonList(" ++\u00e0"), params.get("a"));
72+
}
73+
6774
@Test
6875
public void queryParamsWithEmptyValue() throws Exception {
6976
MultiValueMap<String, String> params = createHttpRequest("/path?a=").getQueryParams();

0 commit comments

Comments
 (0)