Use URLDecoder for query params in WebFlux
Issue: SPR-15860
This commit is contained in:
parent
8b7a670821
commit
645e3492db
|
|
@ -16,11 +16,15 @@
|
||||||
|
|
||||||
package org.springframework.http.server.reactive;
|
package org.springframework.http.server.reactive;
|
||||||
|
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.net.URLDecoder;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
|
||||||
import org.springframework.http.HttpCookie;
|
import org.springframework.http.HttpCookie;
|
||||||
import org.springframework.http.HttpHeaders;
|
import org.springframework.http.HttpHeaders;
|
||||||
import org.springframework.http.server.RequestPath;
|
import org.springframework.http.server.RequestPath;
|
||||||
|
|
@ -38,6 +42,8 @@ import org.springframework.util.StringUtils;
|
||||||
*/
|
*/
|
||||||
public abstract class AbstractServerHttpRequest implements ServerHttpRequest {
|
public abstract class AbstractServerHttpRequest implements ServerHttpRequest {
|
||||||
|
|
||||||
|
private static final Log logger = LogFactory.getLog(ServerHttpRequest.class);
|
||||||
|
|
||||||
private static final Pattern QUERY_PATTERN = Pattern.compile("([^&=]+)(=?)([^&]+)?");
|
private static final Pattern QUERY_PATTERN = Pattern.compile("([^&=]+)(=?)([^&]+)?");
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -113,8 +119,18 @@ public abstract class AbstractServerHttpRequest implements ServerHttpRequest {
|
||||||
return queryParams;
|
return queryParams;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
private String decodeQueryParam(String value) {
|
private String decodeQueryParam(String value) {
|
||||||
return StringUtils.uriDecode(value, StandardCharsets.UTF_8);
|
try {
|
||||||
|
return URLDecoder.decode(value, "UTF-8");
|
||||||
|
}
|
||||||
|
catch (UnsupportedEncodingException ex) {
|
||||||
|
if (logger.isWarnEnabled()) {
|
||||||
|
logger.warn("Could not decode query param [" + value + "] as 'UTF-8'. " +
|
||||||
|
"Falling back on default encoding; exception message: " + ex.getMessage());
|
||||||
|
}
|
||||||
|
return URLDecoder.decode(value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2016 the original author or authors.
|
* Copyright 2002-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|
@ -68,7 +68,7 @@ public class ServerHttpRequestTests {
|
||||||
public void queryParamsWithEncodedValue() throws Exception {
|
public void queryParamsWithEncodedValue() throws Exception {
|
||||||
MultiValueMap<String, String> params = createHttpRequest("/path?a=%20%2B+%C3%A0").getQueryParams();
|
MultiValueMap<String, String> params = createHttpRequest("/path?a=%20%2B+%C3%A0").getQueryParams();
|
||||||
assertEquals(1, params.size());
|
assertEquals(1, params.size());
|
||||||
assertEquals(Collections.singletonList(" ++\u00e0"), params.get("a"));
|
assertEquals(Collections.singletonList(" + \u00e0"), params.get("a"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
||||||
|
|
@ -63,7 +63,7 @@ public class RequestMappingIntegrationTests extends AbstractRequestMappingIntegr
|
||||||
|
|
||||||
@Test // SPR-15140
|
@Test // SPR-15140
|
||||||
public void handleWithEncodedParam() throws Exception {
|
public void handleWithEncodedParam() throws Exception {
|
||||||
String expected = "Hello ++\u00e0!";
|
String expected = "Hello + \u00e0!";
|
||||||
assertEquals(expected, performGet("/param?name=%20%2B+%C3%A0", new HttpHeaders(), String.class).getBody());
|
assertEquals(expected, performGet("/param?name=%20%2B+%C3%A0", new HttpHeaders(), String.class).getBody());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue