From 7b0096af3a5ec7bda98f90dc20e45a4c0f1b671f Mon Sep 17 00:00:00 2001 From: Frank Bille Date: Mon, 24 Jun 2013 23:44:03 +0200 Subject: [PATCH 1/2] Consider a port number when setting the host from the X-Forward-Host header. If we don't and we also use a port in the proxyTo address, we will end up with a host:port:port address causing an exception. --- .../hateoas/mvc/ControllerLinkBuilder.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/springframework/hateoas/mvc/ControllerLinkBuilder.java b/src/main/java/org/springframework/hateoas/mvc/ControllerLinkBuilder.java index fc9fa53b3..a2bc1e0cc 100755 --- a/src/main/java/org/springframework/hateoas/mvc/ControllerLinkBuilder.java +++ b/src/main/java/org/springframework/hateoas/mvc/ControllerLinkBuilder.java @@ -169,7 +169,13 @@ static UriComponentsBuilder getBuilder() { String header = request.getHeader("X-Forwarded-Host"); if (StringUtils.hasText(header)) { - builder.host(header); + if (StringUtils.countOccurrencesOf(header, ":") == 1) { + String[] hostAndPort = StringUtils.split(header, ":"); + builder.host(hostAndPort[0]); + builder.port(Integer.parseInt(hostAndPort[1])); + } else { + builder.host(header); + } } return builder; From 8a7f62249aaeee81625def3c36e3a89eddb6a0c5 Mon Sep 17 00:00:00 2001 From: Frank Bille Date: Mon, 24 Jun 2013 23:59:37 +0200 Subject: [PATCH 2/2] Unit test for showing that a host:port can be used in a X-Forward-Host header --- .../hateoas/mvc/ControllerLinkBuilderUnitTest.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/test/java/org/springframework/hateoas/mvc/ControllerLinkBuilderUnitTest.java b/src/test/java/org/springframework/hateoas/mvc/ControllerLinkBuilderUnitTest.java index 595881a91..b52408a43 100644 --- a/src/test/java/org/springframework/hateoas/mvc/ControllerLinkBuilderUnitTest.java +++ b/src/test/java/org/springframework/hateoas/mvc/ControllerLinkBuilderUnitTest.java @@ -149,6 +149,14 @@ public void usesForwardedHostAsHostIfHeaderIsSet() { assertThat(link.getHref(), startsWith("http://somethingDifferent")); } + @Test + public void usesForwardedHostAndPortFromHeader() { + request.addHeader("X-Forwarded-Host", "localhost:8088"); + + Link link = linkTo(PersonControllerImpl.class).withSelfRel(); + assertThat(link.getHref(), startsWith("http://localhost:8088")); + } + /** * @see #26, #39 */