diff --git a/src/main/java/org/springframework/hateoas/mvc/ControllerLinkBuilder.java b/src/main/java/org/springframework/hateoas/mvc/ControllerLinkBuilder.java index a71d057a3..6eb256bad 100755 --- a/src/main/java/org/springframework/hateoas/mvc/ControllerLinkBuilder.java +++ b/src/main/java/org/springframework/hateoas/mvc/ControllerLinkBuilder.java @@ -261,6 +261,12 @@ static UriComponentsBuilder getBuilder() { builder.port(Integer.parseInt(port)); } + String path = request.getHeader("X-Forwarded-Path"); + + if (hasText(path)) { + builder.path(path); + } + return builder; } diff --git a/src/test/java/org/springframework/hateoas/mvc/ControllerLinkBuilderUnitTest.java b/src/test/java/org/springframework/hateoas/mvc/ControllerLinkBuilderUnitTest.java index f4af2b525..ca136ef5e 100644 --- a/src/test/java/org/springframework/hateoas/mvc/ControllerLinkBuilderUnitTest.java +++ b/src/test/java/org/springframework/hateoas/mvc/ControllerLinkBuilderUnitTest.java @@ -336,6 +336,17 @@ public void usesForwardedHostFromHeaderWithDefaultPort() { assertThat(link.getHref(), startsWith("http://foobarhost/")); } + @Test + public void usesForwardedHostAndPathFromHeaderAndPortFromAnotherHeader() { + + request.addHeader("X-Forwarded-Host", "foobarhost"); + request.addHeader("X-Forwarded-Path", "/foo"); + request.addHeader("X-Forwarded-Port", "1234"); + + Link link = linkTo(PersonControllerImpl.class).withSelfRel(); + assertThat(link.getHref(), startsWith("http://foobarhost:1234/foo")); + } + /** * @see #114 */