From 53649f6020d0c6ad972769e9513dadf614cf0f60 Mon Sep 17 00:00:00 2001 From: Stefan Bley Date: Mon, 30 Jan 2017 15:14:10 +0100 Subject: [PATCH] Separate adding X-ForwardedProto header Add X-Forwarded-Proto header in Zuul PreDecorationFilter even with X-Forwarded-Host header being absent --- .../zuul/filters/pre/PreDecorationFilter.java | 2 ++ .../filters/pre/PreDecorationFilterTests.java | 35 ++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/pre/PreDecorationFilter.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/pre/PreDecorationFilter.java index 1f65218f..fc09c308 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/pre/PreDecorationFilter.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/pre/PreDecorationFilter.java @@ -184,6 +184,8 @@ public class PreDecorationFilter extends ZuulFilter { } else { port = request.getHeader("X-Forwarded-Port") + "," + port; } + } + if (hasHeader(request, "X-Forwarded-Proto")) { proto = request.getHeader("X-Forwarded-Proto") + "," + proto; } ctx.addZuulRequestHeader("X-Forwarded-Host", host); diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/pre/PreDecorationFilterTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/pre/PreDecorationFilterTests.java index b07b43a2..cb834ce0 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/pre/PreDecorationFilterTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/pre/PreDecorationFilterTests.java @@ -104,7 +104,7 @@ public class PreDecorationFilterTests { } @Test - public void xForwardedHostAppends() throws Exception { + public void xForwardedHostAndProtoAppend() throws Exception { this.properties.setPrefix("/api"); this.request.setRequestURI("/api/foo/1"); this.request.setRemoteAddr("5.6.7.8"); @@ -120,6 +120,39 @@ public class PreDecorationFilterTests { assertEquals("https,http", ctx.getZuulRequestHeaders().get("x-forwarded-proto")); } + @Test + public void xForwardedHostOnlyAppends() throws Exception { + this.properties.setPrefix("/api"); + this.request.setRequestURI("/api/foo/1"); + this.request.setRemoteAddr("5.6.7.8"); + this.request.setServerPort(8080); + this.request.addHeader("X-Forwarded-Host", "example.com"); + this.routeLocator.addRoute( + new ZuulRoute("foo", "/foo/**", "foo", null, false, null, null)); + this.filter.run(); + RequestContext ctx = RequestContext.getCurrentContext(); + assertEquals("example.com,localhost:8080", + ctx.getZuulRequestHeaders().get("x-forwarded-host")); + assertEquals("8080", ctx.getZuulRequestHeaders().get("x-forwarded-port")); + assertEquals("http", ctx.getZuulRequestHeaders().get("x-forwarded-proto")); + } + + @Test + public void xForwardedProtoOnlyAppends() throws Exception { + this.properties.setPrefix("/api"); + this.request.setRequestURI("/api/foo/1"); + this.request.setRemoteAddr("5.6.7.8"); + this.request.setServerPort(8080); + this.request.addHeader("X-Forwarded-Proto", "https"); + this.routeLocator.addRoute( + new ZuulRoute("foo", "/foo/**", "foo", null, false, null, null)); + this.filter.run(); + RequestContext ctx = RequestContext.getCurrentContext(); + assertEquals("localhost:8080", ctx.getZuulRequestHeaders().get("x-forwarded-host")); + assertEquals("8080", ctx.getZuulRequestHeaders().get("x-forwarded-port")); + assertEquals("https,http", ctx.getZuulRequestHeaders().get("x-forwarded-proto")); + } + @Test public void hostHeaderSet() throws Exception { this.properties.setPrefix("/api");