Improve regex for parsing query params
Previously UriComponentsBuilder used a regular expression for parsing query name-value pairs where both name and value were expected to not contain neither '&', not '='. The idea is that the presence of reserved characters makes it impossible to guess correctly how to parse the query string (e.g. a=b&c). This change relaxes the constraint on query param values, allowing them to contain '='. In effect '&' is the ultimate separator of name-value pairs, and any '=' in values is ignored. For example "q=1USD=?EUR" is interpreted as "q equals '1USD=?EUR'". Issue: SPR-9832
This commit is contained in:
parent
2f504dda3a
commit
0721146b14
|
@ -53,7 +53,7 @@ import org.springframework.util.StringUtils;
|
|||
*/
|
||||
public class UriComponentsBuilder {
|
||||
|
||||
private static final Pattern QUERY_PARAM_PATTERN = Pattern.compile("([^&=]+)=?([^&=]+)?");
|
||||
private static final Pattern QUERY_PARAM_PATTERN = Pattern.compile("([^&=]+)=?([^&]+)?");
|
||||
|
||||
private static final String SCHEME_PATTERN = "([^:/?#]+):";
|
||||
|
||||
|
|
|
@ -146,6 +146,16 @@ public class UriComponentsBuilderTests {
|
|||
assertEquals("28", result.getFragment());
|
||||
}
|
||||
|
||||
// SPR-9832
|
||||
|
||||
@Test
|
||||
public void fromUriStringQueryParamWithReservedCharInValue() throws URISyntaxException {
|
||||
String uri = "http://www.google.com/ig/calculator?q=1USD=?EUR";
|
||||
UriComponents result = UriComponentsBuilder.fromUriString(uri).build();
|
||||
|
||||
assertEquals("q=1USD=?EUR", result.getQuery());
|
||||
assertEquals("1USD=?EUR", result.getQueryParams().getFirst("q"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void path() throws URISyntaxException {
|
||||
|
|
Loading…
Reference in New Issue