Skip to content

Commit

Permalink
Improved zuul proxy header support.
Browse files Browse the repository at this point in the history
- add zuul.add-host-header property to add Host header
- add port to X-Forwarded-Host as defined in RFC 7239
- extract PreDecorationFilter.filterOrder() into a public constant

fixes gh-1108
  • Loading branch information
sfussenegger authored and spencergibb committed Aug 16, 2016
1 parent 34befdf commit d9768b5
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,11 @@ public class ZuulProperties {
*/
private boolean addProxyHeaders = true;

/**
* Flag to determine whether the proxy forwards the Host header.
*/
private boolean addHostHeader = false;

/**
* Set of service names not to consider for proxying automatically. By default all
* services in the discovery client will be proxied.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
import java.net.MalformedURLException;
import java.net.URL;

import javax.servlet.http.HttpServletRequest;

import org.springframework.cloud.netflix.zuul.filters.ProxyRequestHelper;
import org.springframework.cloud.netflix.zuul.filters.Route;
import org.springframework.cloud.netflix.zuul.filters.RouteLocator;
Expand All @@ -36,6 +38,8 @@
@CommonsLog
public class PreDecorationFilter extends ZuulFilter {

public static final int FILTER_ORDER = 5;

private RouteLocator routeLocator;

private String dispatcherServletPath;
Expand All @@ -58,7 +62,7 @@ public PreDecorationFilter(RouteLocator routeLocator, String dispatcherServletPa

@Override
public int filterOrder() {
return 5;
return FILTER_ORDER;
}

@Override
Expand Down Expand Up @@ -115,8 +119,7 @@ else if (location.startsWith("forward:")) {
ctx.addOriginResponseHeader("X-Zuul-ServiceId", location);
}
if (this.properties.isAddProxyHeaders()) {
ctx.addZuulRequestHeader("X-Forwarded-Host",
ctx.getRequest().getServerName());
ctx.addZuulRequestHeader("X-Forwarded-Host", toHostHeader(ctx.getRequest()));
ctx.addZuulRequestHeader("X-Forwarded-Port",
String.valueOf(ctx.getRequest().getServerPort()));
ctx.addZuulRequestHeader(ZuulHeaders.X_FORWARDED_PROTO,
Expand Down Expand Up @@ -149,6 +152,9 @@ else if (!xforwardedfor.contains(remoteAddr)) { // Prevent duplicates
}
ctx.addZuulRequestHeader("X-Forwarded-For", xforwardedfor);
}
if (this.properties.isAddHostHeader()) {
ctx.addZuulRequestHeader("Host", toHostHeader(ctx.getRequest()));
}
}
}
else {
Expand Down Expand Up @@ -182,6 +188,15 @@ else if (!xforwardedfor.contains(remoteAddr)) { // Prevent duplicates
return null;
}

private String toHostHeader(HttpServletRequest request) {
int port = request.getServerPort();
if ((port == 80 && "http".equals(request.getScheme())) || (port == 443 && "https".equals(request.getScheme()))) {
return request.getServerName();
} else {
return request.getServerName() + ":" + port;
}
}

private URL getUrl(String target) {
try {
return new URL(target);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,34 @@ public void skippedIfForwardToSet() throws Exception {
assertEquals(false, this.filter.shouldFilter());
}

@Test
public void xForwardedHostHasPort() throws Exception {
this.properties.setPrefix("/api");
this.request.setRequestURI("/api/foo/1");
this.request.setRemoteAddr("5.6.7.8");
this.request.setServerPort(8080);
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"));
}

@Test
public void hostHeaderSet() throws Exception {
this.properties.setPrefix("/api");
this.properties.setAddHostHeader(true);
this.request.setRequestURI("/api/foo/1");
this.request.setRemoteAddr("5.6.7.8");
this.request.setServerPort(8080);
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("localhost:8080", ctx.getZuulRequestHeaders().get("host"));
}

@Test
public void prefixRouteAddsHeader() throws Exception {
this.properties.setPrefix("/api");
Expand Down

0 comments on commit d9768b5

Please sign in to comment.