Skip to content

Commit 2405161

Browse files
committed
Consistent encoding in DefaultUriBuilderFactory
Unlike 5,1, TEMPLATE_AND_VALUES is not the default encoding mode. Nevertheless when that mode is used, it should work consistently. Issue: SPR-17465
1 parent f73a522 commit 2405161

File tree

2 files changed

+15
-9
lines changed

2 files changed

+15
-9
lines changed

spring-web/src/main/java/org/springframework/web/util/DefaultUriBuilderFactory.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -228,16 +228,14 @@ public DefaultUriBuilder(String uriTemplate) {
228228
}
229229

230230
private UriComponentsBuilder initUriComponentsBuilder(String uriTemplate) {
231-
231+
UriComponentsBuilder result;
232232
if (StringUtils.isEmpty(uriTemplate)) {
233-
return baseUri != null ? baseUri.cloneBuilder() : UriComponentsBuilder.newInstance();
233+
result = baseUri != null ? baseUri.cloneBuilder() : UriComponentsBuilder.newInstance();
234234
}
235-
236-
UriComponentsBuilder result;
237-
if (baseUri != null) {
238-
UriComponentsBuilder uricBuilder = UriComponentsBuilder.fromUriString(uriTemplate);
239-
UriComponents uric = uricBuilder.build();
240-
result = uric.getHost() == null ? baseUri.cloneBuilder().uriComponents(uric) : uricBuilder;
235+
else if (baseUri != null) {
236+
UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(uriTemplate);
237+
UriComponents uri = builder.build();
238+
result = uri.getHost() == null ? baseUri.cloneBuilder().uriComponents(uri) : builder;
241239
}
242240
else {
243241
result = UriComponentsBuilder.fromUriString(uriTemplate);

spring-web/src/test/java/org/springframework/web/util/DefaultUriBuilderFactoryTests.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public class DefaultUriBuilderFactoryTests {
3535
@Test
3636
public void defaultSettings() {
3737
DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory();
38-
URI uri = factory.uriString("/foo").pathSegment("{id}").build("a/b");
38+
URI uri = factory.uriString("/foo/{id}").build("a/b");
3939
assertEquals("/foo/a%2Fb", uri.toString());
4040
}
4141

@@ -126,6 +126,14 @@ public void encodingValuesOnly() {
126126
assertEquals(expected, uriBuilder.build(singletonMap("id", id)).toString());
127127
}
128128

129+
@Test
130+
public void encodingTemplateAndValuesSpr17465() {
131+
DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory();
132+
factory.setEncodingMode(EncodingMode.TEMPLATE_AND_VALUES);
133+
URI uri = factory.builder().path("/foo/{id}").build("a/b");
134+
assertEquals("/foo/a%2Fb", uri.toString());
135+
}
136+
129137
@Test
130138
public void encodingValuesOnlySpr14147() {
131139
DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory();

0 commit comments

Comments
 (0)