Browse Source

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
pull/1536/head
Rossen Stoyanchev 12 years ago
parent
commit
88906d271b
  1. 2
      org.springframework.web/src/main/java/org/springframework/web/util/UriComponentsBuilder.java
  2. 10
      org.springframework.web/src/test/java/org/springframework/web/util/UriComponentsBuilderTests.java

2
org.springframework.web/src/main/java/org/springframework/web/util/UriComponentsBuilder.java

@ -53,7 +53,7 @@ import org.springframework.util.StringUtils;
*/ */
public class UriComponentsBuilder { 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 = "([^:/?#]+):"; private static final String SCHEME_PATTERN = "([^:/?#]+):";

10
org.springframework.web/src/test/java/org/springframework/web/util/UriComponentsBuilderTests.java

@ -146,6 +146,16 @@ public class UriComponentsBuilderTests {
assertEquals("28", result.getFragment()); 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 @Test
public void path() throws URISyntaxException { public void path() throws URISyntaxException {

Loading…
Cancel
Save