Browse Source

Support {/var} syntax in UriComponentsBuilder

Issue: SPR-12750
pull/759/head
Rossen Stoyanchev 11 years ago
parent
commit
a57d42829c
  1. 39
      spring-web/src/main/java/org/springframework/web/util/UriComponentsBuilder.java
  2. 10
      spring-web/src/test/java/org/springframework/web/util/UriComponentsBuilderTests.java
  3. 15
      spring-web/src/test/java/org/springframework/web/util/UriTemplateTests.java

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

@ -716,18 +716,35 @@ public class UriComponentsBuilder implements Cloneable {
} }
public void addPath(String path) { public void addPath(String path) {
if (StringUtils.hasText(path)) { if (!StringUtils.hasText(path)) {
PathSegmentComponentBuilder psBuilder = getLastBuilder(PathSegmentComponentBuilder.class); return;
FullPathComponentBuilder fpBuilder = getLastBuilder(FullPathComponentBuilder.class); }
if (psBuilder != null) { int startIndex = path.indexOf("{/");
path = path.startsWith("/") ? path : "/" + path; while (startIndex != -1) {
} String pathToAdd = path.substring(0, startIndex);
if (fpBuilder == null) { addPathInternal(pathToAdd);
fpBuilder = new FullPathComponentBuilder();
this.builders.add(fpBuilder); int endIndex = path.indexOf("}", startIndex);
} String pathSegmentToAdd = "{" + path.substring(startIndex + 2, endIndex) + "}";
fpBuilder.append(path); addPathSegments(pathSegmentToAdd);
path = (endIndex >= path.length()) ? "" : path.substring(endIndex + 1);
startIndex = path.indexOf("{/");
}
addPathInternal(path);
}
private void addPathInternal(String path) {
PathSegmentComponentBuilder psBuilder = getLastBuilder(PathSegmentComponentBuilder.class);
FullPathComponentBuilder fpBuilder = getLastBuilder(FullPathComponentBuilder.class);
if (psBuilder != null) {
path = path.startsWith("/") ? path : "/" + path;
}
if (fpBuilder == null) {
fpBuilder = new FullPathComponentBuilder();
this.builders.add(fpBuilder);
} }
fpBuilder.append(path);
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")

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

@ -195,6 +195,16 @@ public class UriComponentsBuilderTests {
assertEquals("1USD=?EUR", result.getQueryParams().getFirst("q")); assertEquals("1USD=?EUR", result.getQueryParams().getFirst("q"));
} }
//SPR-12750
@Test
public void fromUriStringWithVariablesRfc6570() {
String url = "http://example.com/part1/{/part2}/{var1}/url/{/urlvar}/";
UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(url);
UriComponents uriComponents = builder.build().expand("part/2", "var/1", "url/var").encode();
assertEquals("/part1/part%2F2/var/1/url/url%2Fvar/", uriComponents.getPath());
}
// SPR-10779 // SPR-10779
@Test @Test

15
spring-web/src/test/java/org/springframework/web/util/UriTemplateTests.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -98,6 +98,19 @@ public class UriTemplateTests {
template.expand(uriVariables); template.expand(uriVariables);
} }
//SPR-12750
@Test
public void expandMapForRFC6570() throws Exception {
Map<String, String> uriVariables = new HashMap<String, String>(2);
uriVariables.put("hotel", "1");
uriVariables.put("publicpath", "pics/logo.png");
uriVariables.put("scale", "150x150");
UriTemplate template = new UriTemplate("/hotels/{hotel}/pic/{/publicpath}/size/{scale}");
URI result = template.expand(uriVariables);
assertEquals("Invalid expanded template", new URI("/hotels/1/pic/pics%2Flogo.png/size/150x150"), result);
}
@Test @Test
public void expandEncoded() throws Exception { public void expandEncoded() throws Exception {
UriTemplate template = new UriTemplate("http://example.com/hotel list/{hotel}"); UriTemplate template = new UriTemplate("http://example.com/hotel list/{hotel}");

Loading…
Cancel
Save