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 9642b102..517b405b 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 @@ -107,6 +107,15 @@ public class PreDecorationFilter extends ZuulFilter { if (StringUtils.hasText(route.getPrefix())) { ctx.addZuulRequestHeader("X-Forwarded-Prefix", route.getPrefix()); } + String xforwardedfor = ctx.getRequest().getHeader("X-Forwarded-For"); + String remoteAddr = ctx.getRequest().getRemoteAddr(); + if (xforwardedfor == null) { + xforwardedfor = remoteAddr; + } + else if (!xforwardedfor.contains(remoteAddr)) { // Prevent duplicates + xforwardedfor += ", " + remoteAddr; + } + ctx.addZuulRequestHeader("X-Forwarded-For", xforwardedfor); } } } 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 333c6189..5caf62da 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 @@ -85,6 +85,8 @@ public class PreDecorationFilterTests { this.properties.setPrefix("/api"); this.properties.setStripPrefix(true); this.request.setRequestURI("/api/foo/1"); + this.request.setRemoteAddr("5.6.7.8"); + this.request.addHeader("X-Forwarded-For", "1.2.3.4"); this.routeLocator.addRoute( new ZuulRoute("foo", "/foo/**", "foo", null, false, null, null)); this.filter.run(); @@ -94,6 +96,7 @@ public class PreDecorationFilterTests { assertEquals("80", ctx.getZuulRequestHeaders().get("x-forwarded-port")); assertEquals("http", ctx.getZuulRequestHeaders().get("x-forwarded-proto")); assertEquals("/api", ctx.getZuulRequestHeaders().get("x-forwarded-prefix")); + assertEquals("1.2.3.4, 5.6.7.8", ctx.getZuulRequestHeaders().get("x-forwarded-for")); assertEquals("foo", getHeader(ctx.getOriginResponseHeaders(), "x-zuul-serviceid")); }