diff --git a/src/main/java/org/springframework/hateoas/UriTemplate.java b/src/main/java/org/springframework/hateoas/UriTemplate.java index 1e3da868..0560b57f 100644 --- a/src/main/java/org/springframework/hateoas/UriTemplate.java +++ b/src/main/java/org/springframework/hateoas/UriTemplate.java @@ -357,10 +357,14 @@ public class UriTemplate implements Iterable, Serializable { String head = index == -1 ? template : template.substring(0, index); String tail = index == -1 ? "" : template.substring(index); - String encodedBase = UriComponentsBuilder.fromUriString(head) - .encode() - .build() - .toUriString(); + + // Encode head if it's more than just the scheme + String encodedBase = head.endsWith("://") && tail.startsWith("{") + ? head + : UriComponentsBuilder.fromUriString(head) + .encode() + .build() + .toUriString(); head = encodedBase.length() > head.length() ? encodedBase : head; diff --git a/src/test/java/org/springframework/hateoas/UriTemplateUnitTest.java b/src/test/java/org/springframework/hateoas/UriTemplateUnitTest.java index 49980a9e..f7963ece 100755 --- a/src/test/java/org/springframework/hateoas/UriTemplateUnitTest.java +++ b/src/test/java/org/springframework/hateoas/UriTemplateUnitTest.java @@ -375,6 +375,13 @@ class UriTemplateUnitTest { assertThat(template.toString()).isEqualTo("/path/{bar}/foo.zip?type=foo{&foobar}"); } + @Test // #1727 + void supportsVariableInHostName() { + + assertThatCode(() -> UriTemplate.of("https://{somehost}/somepath")) + .doesNotThrowAnyException(); + } + private static void assertVariables(UriTemplate template, TemplateVariable... variables) { assertVariables(template, Arrays.asList(variables)); }