From d68700231eb1d8afaf27328cc5d576a71e966a2a Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Tue, 16 May 2017 13:02:14 +0200 Subject: [PATCH] #582 - LinkBuilder now makes sure appended path is considered path segment. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We now prepend the given path (and query) handed to LinkBuilderSupport.slash(…) to make sure calls to UriComponentsBuilder.fromUriString(…) always considers the given value as path. Previously, a value containing a colon caused problems as the regex to detect scheme and port would accidentally match. Related ticket: https://jira.spring.io/browse/DATAREST-1074 --- .../hateoas/core/LinkBuilderSupport.java | 2 ++ .../hateoas/core/LinkBuilderSupportUnitTest.java | 13 +++++++++++++ .../hateoas/mvc/ControllerLinkBuilderUnitTest.java | 2 +- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/springframework/hateoas/core/LinkBuilderSupport.java b/src/main/java/org/springframework/hateoas/core/LinkBuilderSupport.java index a2d1ac06..9a1c4e0f 100644 --- a/src/main/java/org/springframework/hateoas/core/LinkBuilderSupport.java +++ b/src/main/java/org/springframework/hateoas/core/LinkBuilderSupport.java @@ -86,6 +86,8 @@ public abstract class LinkBuilderSupport implements LinkB return getThis(); } + path = path.startsWith("/") ? path : "/".concat(path); + return slash(UriComponentsBuilder.fromUriString(path).build(), false); } diff --git a/src/test/java/org/springframework/hateoas/core/LinkBuilderSupportUnitTest.java b/src/test/java/org/springframework/hateoas/core/LinkBuilderSupportUnitTest.java index 869a7c9a..1511af1d 100644 --- a/src/test/java/org/springframework/hateoas/core/LinkBuilderSupportUnitTest.java +++ b/src/test/java/org/springframework/hateoas/core/LinkBuilderSupportUnitTest.java @@ -53,6 +53,19 @@ public class LinkBuilderSupportUnitTest extends TestUtils { assertThat(builder.toString(), endsWith("foo%20bar#foo")); } + /** + * @see #582 + */ + @Test + public void appendsPathContainingColonsCorrectly() { + + SampleLinkBuilder builder = new SampleLinkBuilder(UriComponentsBuilder.newInstance()); + + builder = builder.slash("47:11"); + + assertThat(builder.toString(), endsWith("47:11")); + } + static class SampleLinkBuilder extends LinkBuilderSupport { public SampleLinkBuilder(UriComponentsBuilder builder) { diff --git a/src/test/java/org/springframework/hateoas/mvc/ControllerLinkBuilderUnitTest.java b/src/test/java/org/springframework/hateoas/mvc/ControllerLinkBuilderUnitTest.java index a6dc37c3..3cd2bb90 100644 --- a/src/test/java/org/springframework/hateoas/mvc/ControllerLinkBuilderUnitTest.java +++ b/src/test/java/org/springframework/hateoas/mvc/ControllerLinkBuilderUnitTest.java @@ -397,7 +397,7 @@ public class ControllerLinkBuilderUnitTest extends TestUtils { * @see #192 */ @Test - public void usesRootMappingOfTargetClassForMethodsOfParen() throws Exception { + public void usesRootMappingOfTargetClassForMethodsOfParent() throws Exception { Method method = ParentControllerWithoutRootMapping.class.getMethod("someEmptyMappedMethod");