From 24051619a5d67848ebee635170325d8842a2b445 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Fri, 9 Nov 2018 14:13:51 -0500 Subject: [PATCH] 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 --- .../web/util/DefaultUriBuilderFactory.java | 14 ++++++-------- .../web/util/DefaultUriBuilderFactoryTests.java | 10 +++++++++- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/web/util/DefaultUriBuilderFactory.java b/spring-web/src/main/java/org/springframework/web/util/DefaultUriBuilderFactory.java index 2a2a36c65d..b44df39fae 100644 --- a/spring-web/src/main/java/org/springframework/web/util/DefaultUriBuilderFactory.java +++ b/spring-web/src/main/java/org/springframework/web/util/DefaultUriBuilderFactory.java @@ -228,16 +228,14 @@ public class DefaultUriBuilderFactory implements UriBuilderFactory { } private UriComponentsBuilder initUriComponentsBuilder(String uriTemplate) { - + UriComponentsBuilder result; if (StringUtils.isEmpty(uriTemplate)) { - return baseUri != null ? baseUri.cloneBuilder() : UriComponentsBuilder.newInstance(); + result = baseUri != null ? baseUri.cloneBuilder() : UriComponentsBuilder.newInstance(); } - - UriComponentsBuilder result; - if (baseUri != null) { - UriComponentsBuilder uricBuilder = UriComponentsBuilder.fromUriString(uriTemplate); - UriComponents uric = uricBuilder.build(); - result = uric.getHost() == null ? baseUri.cloneBuilder().uriComponents(uric) : uricBuilder; + else if (baseUri != null) { + UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(uriTemplate); + UriComponents uri = builder.build(); + result = uri.getHost() == null ? baseUri.cloneBuilder().uriComponents(uri) : builder; } else { result = UriComponentsBuilder.fromUriString(uriTemplate); diff --git a/spring-web/src/test/java/org/springframework/web/util/DefaultUriBuilderFactoryTests.java b/spring-web/src/test/java/org/springframework/web/util/DefaultUriBuilderFactoryTests.java index 1f42b32f34..050176ea76 100644 --- a/spring-web/src/test/java/org/springframework/web/util/DefaultUriBuilderFactoryTests.java +++ b/spring-web/src/test/java/org/springframework/web/util/DefaultUriBuilderFactoryTests.java @@ -35,7 +35,7 @@ public class DefaultUriBuilderFactoryTests { @Test public void defaultSettings() { DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory(); - URI uri = factory.uriString("/foo").pathSegment("{id}").build("a/b"); + URI uri = factory.uriString("/foo/{id}").build("a/b"); assertEquals("/foo/a%2Fb", uri.toString()); } @@ -126,6 +126,14 @@ public class DefaultUriBuilderFactoryTests { assertEquals(expected, uriBuilder.build(singletonMap("id", id)).toString()); } + @Test + public void encodingTemplateAndValuesSpr17465() { + DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory(); + factory.setEncodingMode(EncodingMode.TEMPLATE_AND_VALUES); + URI uri = factory.builder().path("/foo/{id}").build("a/b"); + assertEquals("/foo/a%2Fb", uri.toString()); + } + @Test public void encodingValuesOnlySpr14147() { DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory();