Browse Source

Fix UriComponentsBuilder.fromUriString parsing error

This commit fixes cases where part of the URI was mistaken for the
userinfo when:
* the URI did not contain any path
* the query string contained the "@"

Issue: SPR-11964
pull/585/merge
Brian Clozel 11 years ago
parent
commit
a4484bb767
  1. 2
      spring-web/src/main/java/org/springframework/web/util/UriComponentsBuilder.java
  2. 12
      spring-web/src/test/java/org/springframework/web/util/UriComponentsBuilderTests.java

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

@ -62,7 +62,7 @@ public class UriComponentsBuilder {
private static final String HTTP_PATTERN = "(?i)(http|https):"; private static final String HTTP_PATTERN = "(?i)(http|https):";
private static final String USERINFO_PATTERN = "([^@/]*)"; private static final String USERINFO_PATTERN = "([^@\\[/?#]*)";
private static final String HOST_IPV4_PATTERN = "[^\\[/?#:]*"; private static final String HOST_IPV4_PATTERN = "[^\\[/?#:]*";

12
spring-web/src/test/java/org/springframework/web/util/UriComponentsBuilderTests.java

@ -26,6 +26,7 @@ import org.junit.Test;
import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap; import org.springframework.util.MultiValueMap;
import org.springframework.util.StringUtils;
import static org.hamcrest.Matchers.*; import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*; import static org.junit.Assert.*;
@ -216,6 +217,17 @@ public class UriComponentsBuilderTests {
assertEquals("[::192.168.1.1]", resultIPv4compatible.getHost()); assertEquals("[::192.168.1.1]", resultIPv4compatible.getHost());
} }
// SPR-11970
@Test
public void fromUriStringNoPathWithReservedCharInQuery() {
UriComponents result = UriComponentsBuilder.fromUriString("http://example.com?foo=bar@baz").build();
assertTrue(StringUtils.isEmpty(result.getUserInfo()));
assertEquals("example.com", result.getHost());
assertTrue(result.getQueryParams().containsKey("foo"));
assertEquals("bar@baz", result.getQueryParams().getFirst("foo"));
}
@Test @Test
public void path() throws URISyntaxException { public void path() throws URISyntaxException {
UriComponentsBuilder builder = UriComponentsBuilder.fromPath("/foo/bar"); UriComponentsBuilder builder = UriComponentsBuilder.fromPath("/foo/bar");

Loading…
Cancel
Save