From 975f1ff7fdbe420a1f8bf6fd8251e9e2cf957fd8 Mon Sep 17 00:00:00 2001 From: "Greg L. Turnquist" Date: Fri, 5 Jun 2020 09:41:49 -0500 Subject: [PATCH] #475 - Support all variable formats. RFC-6570 specifies percent-encoding as a valid way to encode characters. By expanding the regex for UriTemplate to include '%', it's possible to support all variants. See: https://tools.ietf.org/html/rfc6570#section-2.3 Original issue: #246 --- .../org/springframework/hateoas/UriTemplate.java | 2 +- .../hateoas/UriTemplateUnitTest.java | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/springframework/hateoas/UriTemplate.java b/src/main/java/org/springframework/hateoas/UriTemplate.java index 21cc7f03..8b3248c5 100644 --- a/src/main/java/org/springframework/hateoas/UriTemplate.java +++ b/src/main/java/org/springframework/hateoas/UriTemplate.java @@ -51,7 +51,7 @@ import org.springframework.web.util.UriUtils; */ public class UriTemplate implements Iterable, Serializable { - private static final Pattern VARIABLE_REGEX = Pattern.compile("\\{([\\?\\&#/]?)([\\w\\,*]+)\\}"); + private static final Pattern VARIABLE_REGEX = Pattern.compile("\\{([\\?\\&#/]?)([\\w%\\,*]+)\\}"); private static final long serialVersionUID = -1007874653930162262L; private final TemplateVariables variables; diff --git a/src/test/java/org/springframework/hateoas/UriTemplateUnitTest.java b/src/test/java/org/springframework/hateoas/UriTemplateUnitTest.java index ab23eae4..0b60e568 100755 --- a/src/test/java/org/springframework/hateoas/UriTemplateUnitTest.java +++ b/src/test/java/org/springframework/hateoas/UriTemplateUnitTest.java @@ -39,7 +39,7 @@ import org.apache.commons.io.output.ByteArrayOutputStream; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; -import org.springframework.hateoas.TemplateVariable.VariableType; +import org.springframework.hateoas.TemplateVariable.*; /** * Unit tests for {@link UriTemplate}. @@ -348,6 +348,20 @@ class UriTemplateUnitTest { assertThat(UriTemplate.isTemplate("http://localhost/api/rest/v1/userGroups/50/functions/{?id*}")).isTrue(); } + @Test // #475 + void variablesWithPercentEncodingShouldWork() { + + assertThat(UriTemplate.of("http://localhost/foo/bar/{%24filter}").expand("value")) + .isEqualTo(URI.create("http://localhost/foo/bar/value")); + } + + @Test // #475 + void variablesWithUnderscoresShouldWork() { + + assertThat(UriTemplate.of("http://localhost/foo/bar/{_filter}").expand("value")) + .isEqualTo(URI.create("http://localhost/foo/bar/value")); + } + private static void assertVariables(UriTemplate template, TemplateVariable... variables) { assertVariables(template, Arrays.asList(variables)); }