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:
Rossen Stoyanchev
2012-10-22 10:37:40 -04:00
parent 2f504dda3a
commit 0721146b14
2 changed files with 11 additions and 1 deletions

View File

@@ -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 = "([^:/?#]+):";