Align UriComponents.toUri() with toUriString()

Update HierarchicalUriComponents.toUri() to only prepend a missing '/'
when the scheme, user info, host or port are specified. This makes
the toUri() method behave in the same way as .toUriString() and allows
relative URIs to be created.

Issue: SPR-10231
master
Phillip Webb 12 years ago
parent 203b22b246
commit 2ca75386f1
  1. 3
      spring-web/src/main/java/org/springframework/web/util/HierarchicalUriComponents.java
  2. 16
      spring-web/src/test/java/org/springframework/web/util/UriComponentsBuilderTests.java

@ -407,8 +407,11 @@ final class HierarchicalUriComponents extends UriComponents {
else { else {
String path = getPath(); String path = getPath();
if (StringUtils.hasLength(path) && path.charAt(0) != PATH_DELIMITER) { if (StringUtils.hasLength(path) && path.charAt(0) != PATH_DELIMITER) {
// Only prefix the path delimiter if something exists before it
if(getScheme() != null || getUserInfo() != null || getHost() != null || getPort() != -1) {
path = PATH_DELIMITER + path; path = PATH_DELIMITER + path;
} }
}
return new URI(getScheme(), getUserInfo(), getHost(), getPort(), path, getQuery(), return new URI(getScheme(), getUserInfo(), getHost(), getPort(), path, getQuery(),
getFragment()); getFragment());
} }

@ -57,7 +57,9 @@ public class UriComponentsBuilderTests {
assertEquals("bar", result.getQuery()); assertEquals("bar", result.getQuery());
assertEquals("baz", result.getFragment()); assertEquals("baz", result.getFragment());
URI expected = new URI("/foo?bar#baz"); assertEquals("Invalid result URI String", "foo?bar#baz", result.toUriString());
URI expected = new URI("foo?bar#baz");
assertEquals("Invalid result URI", expected, result.toUri()); assertEquals("Invalid result URI", expected, result.toUri());
result = UriComponentsBuilder.fromPath("/foo").build(); result = UriComponentsBuilder.fromPath("/foo").build();
@ -332,4 +334,16 @@ public class UriComponentsBuilderTests {
assertThat(uriComponents.toUriString(), equalTo("http://example.com/foo?bar")); assertThat(uriComponents.toUriString(), equalTo("http://example.com/foo?bar"));
} }
@Test
public void relativeUrls() throws Exception {
assertThat(UriComponentsBuilder.fromUriString("http://example.com/foo/../bar").build().toString(), equalTo("http://example.com/foo/../bar"));
assertThat(UriComponentsBuilder.fromUriString("http://example.com/foo/../bar").build().toUriString(), equalTo("http://example.com/foo/../bar"));
assertThat(UriComponentsBuilder.fromUriString("http://example.com/foo/../bar").build().toUri().getPath(), equalTo("/foo/../bar"));
assertThat(UriComponentsBuilder.fromUriString("../../").build().toString(), equalTo("../../"));
assertThat(UriComponentsBuilder.fromUriString("../../").build().toUriString(), equalTo("../../"));
assertThat(UriComponentsBuilder.fromUriString("../../").build().toUri().getPath(), equalTo("../../"));
assertThat(UriComponentsBuilder.fromUriString("http://example.com").path("foo/../bar").build().toString(), equalTo("http://example.com/foo/../bar"));
assertThat(UriComponentsBuilder.fromUriString("http://example.com").path("foo/../bar").build().toUriString(), equalTo("http://example.com/foo/../bar"));
assertThat(UriComponentsBuilder.fromUriString("http://example.com").path("foo/../bar").build().toUri().getPath(), equalTo("/foo/../bar"));
}
} }

Loading…
Cancel
Save