提交 0721146b 编写于 作者: R Rossen Stoyanchev

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
上级 2f504dda
......@@ -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 {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册