From d3ece765bc969bb4b38af0233043a7019757b5a4 Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Thu, 28 Nov 2019 11:14:57 +0100 Subject: [PATCH] #1127 - Avoid double encoding in UriTemplate. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We now directly use UriComponentsBuilder in UriTemplate.expand(…) to avoid potential double encoding in the base URI. --- .../org/springframework/hateoas/UriTemplate.java | 14 ++++++-------- .../hateoas/UriTemplateUnitTest.java | 7 +++++++ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/springframework/hateoas/UriTemplate.java b/src/main/java/org/springframework/hateoas/UriTemplate.java index c41f0cdb..e899a345 100644 --- a/src/main/java/org/springframework/hateoas/UriTemplate.java +++ b/src/main/java/org/springframework/hateoas/UriTemplate.java @@ -244,8 +244,7 @@ public class UriTemplate implements Iterable, Serializable { return URI.create(baseUri); } - org.springframework.web.util.UriTemplate baseTemplate = new org.springframework.web.util.UriTemplate(baseUri); - UriComponentsBuilder builder = UriComponentsBuilder.fromUri(baseTemplate.expand(parameters)); + UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(baseUri); Iterator iterator = Arrays.asList(parameters).iterator(); for (TemplateVariable variable : getOptionalVariables()) { @@ -254,7 +253,7 @@ public class UriTemplate implements Iterable, Serializable { appendToBuilder(builder, variable, value); } - return builder.build().toUri(); + return builder.buildAndExpand(parameters).toUri(); } /** @@ -265,20 +264,19 @@ public class UriTemplate implements Iterable, Serializable { */ public URI expand(Map parameters) { + Assert.notNull(parameters, "Parameters must not be null!"); + if (TemplateVariables.NONE.equals(variables)) { return URI.create(baseUri); } - Assert.notNull(parameters, "Parameters must not be null!"); - - org.springframework.web.util.UriTemplate baseTemplate = new org.springframework.web.util.UriTemplate(baseUri); - UriComponentsBuilder builder = UriComponentsBuilder.fromUri(baseTemplate.expand(parameters)); + UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(baseUri); for (TemplateVariable variable : getOptionalVariables()) { appendToBuilder(builder, variable, parameters.get(variable.getName())); } - return builder.build().toUri(); + return builder.buildAndExpand(parameters).toUri(); } /* diff --git a/src/test/java/org/springframework/hateoas/UriTemplateUnitTest.java b/src/test/java/org/springframework/hateoas/UriTemplateUnitTest.java index 7a299e2d..441003bd 100755 --- a/src/test/java/org/springframework/hateoas/UriTemplateUnitTest.java +++ b/src/test/java/org/springframework/hateoas/UriTemplateUnitTest.java @@ -342,6 +342,13 @@ class UriTemplateUnitTest { assertThat(expandedTemplate).isEqualTo("/foo?bar=barExpanded&foobar=singleValue"); } + @Test // #1127 + void escapesBaseUriProperly() { + + assertThat(UriTemplate.of("https://example.org/foo and bar/{baz}").expand("xyzzy")) + .hasToString("https://example.org/foo%20and%20bar/xyzzy"); + } + private static void assertVariables(UriTemplate template, TemplateVariable... variables) { assertVariables(template, Arrays.asList(variables)); }