diff --git a/spring-web/src/main/java/org/springframework/web/util/UriComponentsBuilder.java b/spring-web/src/main/java/org/springframework/web/util/UriComponentsBuilder.java index dc53ec6481..a52615d1ef 100644 --- a/spring-web/src/main/java/org/springframework/web/util/UriComponentsBuilder.java +++ b/spring-web/src/main/java/org/springframework/web/util/UriComponentsBuilder.java @@ -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 = "([^:/?#]+):"; diff --git a/spring-web/src/test/java/org/springframework/web/util/UriComponentsBuilderTests.java b/spring-web/src/test/java/org/springframework/web/util/UriComponentsBuilderTests.java index e01436319b..057733e943 100644 --- a/spring-web/src/test/java/org/springframework/web/util/UriComponentsBuilderTests.java +++ b/spring-web/src/test/java/org/springframework/web/util/UriComponentsBuilderTests.java @@ -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 {