diff --git a/src/main/java/org/springframework/hateoas/mvc/ControllerLinkBuilder.java b/src/main/java/org/springframework/hateoas/mvc/ControllerLinkBuilder.java index 1a9262482..25b8ea6a1 100755 --- a/src/main/java/org/springframework/hateoas/mvc/ControllerLinkBuilder.java +++ b/src/main/java/org/springframework/hateoas/mvc/ControllerLinkBuilder.java @@ -158,7 +158,8 @@ public UriComponentsBuilder toUriComponentsBuilder() { /** * Returns a {@link UriComponentsBuilder} obtained from the current servlet mapping with the host tweaked in case the - * request contains an {@code X-Forwarded-Host} header. + * request contains an {@code X-Forwarded-Host} header and the scheme tweaked in case the request contains an + * {@code X-Forwarded-Ssl} header * * @return */ @@ -167,6 +168,12 @@ static UriComponentsBuilder getBuilder() { HttpServletRequest request = getCurrentRequest(); ServletUriComponentsBuilder builder = ServletUriComponentsBuilder.fromServletMapping(request); + String forwardedSsl = request.getHeader("X-Forwarded-Ssl"); + + if(StringUtils.hasText(forwardedSsl) && forwardedSsl.equalsIgnoreCase("on")) { + builder.scheme("https"); + } + String header = request.getHeader("X-Forwarded-Host"); if (!StringUtils.hasText(header)) { diff --git a/src/test/java/org/springframework/hateoas/mvc/ControllerLinkBuilderUnitTest.java b/src/test/java/org/springframework/hateoas/mvc/ControllerLinkBuilderUnitTest.java index cbac99b7e..ac9a76616 100644 --- a/src/test/java/org/springframework/hateoas/mvc/ControllerLinkBuilderUnitTest.java +++ b/src/test/java/org/springframework/hateoas/mvc/ControllerLinkBuilderUnitTest.java @@ -149,6 +149,34 @@ public void usesForwardedHostAsHostIfHeaderIsSet() { assertThat(link.getHref(), startsWith("http://somethingDifferent")); } + @Test + public void usesForwardedSslIfHeaderIsSet() { + + request.addHeader("X-Forwarded-Ssl", "on"); + + Link link = linkTo(PersonControllerImpl.class).withSelfRel(); + assertThat(link.getHref(), startsWith("https://")); + } + + @Test + public void usesForwardedSslIfHeaderIsSetOff() { + + request.addHeader("X-Forwarded-Ssl", "off"); + + Link link = linkTo(PersonControllerImpl.class).withSelfRel(); + assertThat(link.getHref(), startsWith("http://")); + } + + @Test + public void usesForwardedSslAndHostIfHeaderIsSet() { + + request.addHeader("X-Forwarded-Host", "somethingDifferent"); + request.addHeader("X-Forwarded-Ssl", "on"); + + Link link = linkTo(PersonControllerImpl.class).withSelfRel(); + assertThat(link.getHref(), startsWith("https://somethingDifferent")); + } + /** * @see #26, #39 */