diff --git a/spring-cloud-netflix-zuul/src/main/java/org/springframework/cloud/netflix/zuul/ZuulProxyAutoConfiguration.java b/spring-cloud-netflix-zuul/src/main/java/org/springframework/cloud/netflix/zuul/ZuulProxyAutoConfiguration.java index f6e63710e..172d39f67 100644 --- a/spring-cloud-netflix-zuul/src/main/java/org/springframework/cloud/netflix/zuul/ZuulProxyAutoConfiguration.java +++ b/spring-cloud-netflix-zuul/src/main/java/org/springframework/cloud/netflix/zuul/ZuulProxyAutoConfiguration.java @@ -141,9 +141,7 @@ public class ZuulProxyAutoConfiguration extends ZuulServerAutoConfiguration { @Bean public ProxyRequestHelper proxyRequestHelper(ZuulProperties zuulProperties) { - ProxyRequestHelper helper = new ProxyRequestHelper(); - helper.setIgnoredHeaders(zuulProperties.getIgnoredHeaders()); - helper.setTraceRequestBody(zuulProperties.isTraceRequestBody()); + ProxyRequestHelper helper = new ProxyRequestHelper(zuulProperties); return helper; } @@ -171,12 +169,10 @@ public class ZuulProxyAutoConfiguration extends ZuulServerAutoConfiguration { @Bean public ProxyRequestHelper proxyRequestHelper(ZuulProperties zuulProperties) { - TraceProxyRequestHelper helper = new TraceProxyRequestHelper(); + TraceProxyRequestHelper helper = new TraceProxyRequestHelper(zuulProperties); if (this.traces != null) { helper.setTraces(this.traces); } - helper.setIgnoredHeaders(zuulProperties.getIgnoredHeaders()); - helper.setTraceRequestBody(zuulProperties.isTraceRequestBody()); return helper; } } diff --git a/spring-cloud-netflix-zuul/src/main/java/org/springframework/cloud/netflix/zuul/filters/ProxyRequestHelper.java b/spring-cloud-netflix-zuul/src/main/java/org/springframework/cloud/netflix/zuul/filters/ProxyRequestHelper.java index f4504283d..dc9c163ec 100644 --- a/spring-cloud-netflix-zuul/src/main/java/org/springframework/cloud/netflix/zuul/filters/ProxyRequestHelper.java +++ b/spring-cloud-netflix-zuul/src/main/java/org/springframework/cloud/netflix/zuul/filters/ProxyRequestHelper.java @@ -71,6 +71,18 @@ public class ProxyRequestHelper { private boolean traceRequestBody = true; + private boolean addHostHeader = false; + + @Deprecated + //TODO Remove in 2.1.x + public ProxyRequestHelper() {} + + public ProxyRequestHelper(ZuulProperties zuulProperties) { + this.ignoredHeaders.addAll(zuulProperties.getIgnoredHeaders()); + this.traceRequestBody = zuulProperties.isTraceRequestBody(); + this.addHostHeader = zuulProperties.isAddHostHeader(); + } + public void setWhitelistHosts(Set whitelistHosts) { this.whitelistHosts.addAll(whitelistHosts); } @@ -79,10 +91,14 @@ public class ProxyRequestHelper { this.sensitiveHeaders.addAll(sensitiveHeaders); } + @Deprecated + //TODO Remove in 2.1.x public void setIgnoredHeaders(Set ignoredHeaders) { this.ignoredHeaders.addAll(ignoredHeaders); } + @Deprecated + //TODO Remove in 2.1.x public void setTraceRequestBody(boolean traceRequestBody) { this.traceRequestBody = traceRequestBody; } @@ -208,6 +224,9 @@ public class ProxyRequestHelper { } switch (name) { case "host": + if(addHostHeader) { + return true; + } case "connection": case "content-length": case "server": diff --git a/spring-cloud-netflix-zuul/src/main/java/org/springframework/cloud/netflix/zuul/filters/TraceProxyRequestHelper.java b/spring-cloud-netflix-zuul/src/main/java/org/springframework/cloud/netflix/zuul/filters/TraceProxyRequestHelper.java index 13bc5d768..b69966459 100644 --- a/spring-cloud-netflix-zuul/src/main/java/org/springframework/cloud/netflix/zuul/filters/TraceProxyRequestHelper.java +++ b/spring-cloud-netflix-zuul/src/main/java/org/springframework/cloud/netflix/zuul/filters/TraceProxyRequestHelper.java @@ -48,6 +48,15 @@ import org.springframework.util.StringUtils; public class TraceProxyRequestHelper extends ProxyRequestHelper { private HttpTraceRepository traces; + + @Deprecated + //TODO Remove in 2.1.x + public TraceProxyRequestHelper(){} + + public TraceProxyRequestHelper(ZuulProperties zuulProperties) { + super(zuulProperties); + } + private final HttpExchangeTracer tracer = new HttpExchangeTracer( Include.defaultIncludes()); diff --git a/spring-cloud-netflix-zuul/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/RibbonRoutingFilter.java b/spring-cloud-netflix-zuul/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/RibbonRoutingFilter.java index 5d4d8285c..d1f182f76 100644 --- a/spring-cloud-netflix-zuul/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/RibbonRoutingFilter.java +++ b/spring-cloud-netflix-zuul/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/RibbonRoutingFilter.java @@ -78,6 +78,8 @@ public class RibbonRoutingFilter extends ZuulFilter { } } + @Deprecated + //TODO Remove in 2.1.x public RibbonRoutingFilter(RibbonCommandFactory ribbonCommandFactory) { this(new ProxyRequestHelper(), ribbonCommandFactory, null); } diff --git a/spring-cloud-netflix-zuul/src/test/java/org/springframework/cloud/netflix/zuul/filters/ProxyRequestHelperTests.java b/spring-cloud-netflix-zuul/src/test/java/org/springframework/cloud/netflix/zuul/filters/ProxyRequestHelperTests.java index 3bd28365f..bb922f224 100644 --- a/spring-cloud-netflix-zuul/src/test/java/org/springframework/cloud/netflix/zuul/filters/ProxyRequestHelperTests.java +++ b/spring-cloud-netflix-zuul/src/test/java/org/springframework/cloud/netflix/zuul/filters/ProxyRequestHelperTests.java @@ -44,6 +44,7 @@ import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.nullValue; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.mockito.MockitoAnnotations.initMocks; @@ -82,7 +83,7 @@ public class ProxyRequestHelperTests { request.addHeader("multiName", "multiValue2"); RequestContext.getCurrentContext().setRequest(request); - TraceProxyRequestHelper helper = new TraceProxyRequestHelper(); + TraceProxyRequestHelper helper = new TraceProxyRequestHelper(new ZuulProperties()); this.traceRepository = new InMemoryHttpTraceRepository(); helper.setTraces(this.traceRepository); @@ -98,8 +99,9 @@ public class ProxyRequestHelperTests { public void shouldDebugBodyDisabled() throws Exception { RequestContext context = RequestContext.getCurrentContext(); - ProxyRequestHelper helper = new ProxyRequestHelper(); - helper.setTraceRequestBody(false); + ZuulProperties zuulProperties = new ZuulProperties(); + zuulProperties.setTraceRequestBody(false); + ProxyRequestHelper helper = new ProxyRequestHelper(zuulProperties); assertThat("shouldDebugBody wrong", helper.shouldDebugBody(context), is(false)); } @@ -111,7 +113,7 @@ public class ProxyRequestHelperTests { context.setChunkedRequestBody(); context.setRequest(request); - ProxyRequestHelper helper = new ProxyRequestHelper(); + ProxyRequestHelper helper = new ProxyRequestHelper(new ZuulProperties()); assertThat("shouldDebugBody wrong", helper.shouldDebugBody(context), is(false)); } @@ -123,7 +125,7 @@ public class ProxyRequestHelperTests { context.setZuulEngineRan(); context.setRequest(request); - ProxyRequestHelper helper = new ProxyRequestHelper(); + ProxyRequestHelper helper = new ProxyRequestHelper(new ZuulProperties()); assertThat("shouldDebugBody wrong", helper.shouldDebugBody(context), is(false)); } @@ -135,7 +137,7 @@ public class ProxyRequestHelperTests { RequestContext context = RequestContext.getCurrentContext(); context.setRequest(request); - ProxyRequestHelper helper = new ProxyRequestHelper(); + ProxyRequestHelper helper = new ProxyRequestHelper(new ZuulProperties()); assertThat("shouldDebugBody wrong", helper.shouldDebugBody(context), is(true)); } @@ -144,7 +146,7 @@ public class ProxyRequestHelperTests { public void shouldDebugBodyNullRequest() throws Exception { RequestContext context = RequestContext.getCurrentContext(); - ProxyRequestHelper helper = new ProxyRequestHelper(); + ProxyRequestHelper helper = new ProxyRequestHelper(new ZuulProperties()); assertThat("shouldDebugBody wrong", helper.shouldDebugBody(context), is(true)); } @@ -156,7 +158,7 @@ public class ProxyRequestHelperTests { RequestContext context = RequestContext.getCurrentContext(); context.setRequest(request); - ProxyRequestHelper helper = new ProxyRequestHelper(); + ProxyRequestHelper helper = new ProxyRequestHelper(new ZuulProperties()); assertThat("shouldDebugBody wrong", helper.shouldDebugBody(context), is(true)); } @@ -168,7 +170,7 @@ public class ProxyRequestHelperTests { RequestContext context = RequestContext.getCurrentContext(); context.setRequest(request); - ProxyRequestHelper helper = new ProxyRequestHelper(); + ProxyRequestHelper helper = new ProxyRequestHelper(new ZuulProperties()); assertThat("shouldDebugBody wrong", helper.shouldDebugBody(context), is(false)); } @@ -180,7 +182,7 @@ public class ProxyRequestHelperTests { request.addHeader("multiName", "multiValue1"); request.addHeader("multiName", "multiValue2"); - TraceProxyRequestHelper helper = new TraceProxyRequestHelper(); + TraceProxyRequestHelper helper = new TraceProxyRequestHelper(new ZuulProperties()); helper.setTraces(this.traceRepository); MultiValueMap headers = helper.buildZuulRequestHeaders(request); @@ -201,7 +203,7 @@ public class ProxyRequestHelperTests { public void buildZuulRequestHeadersRequestsGzipAndOnlyGzip() { MockHttpServletRequest request = new MockHttpServletRequest("", "/"); - ProxyRequestHelper helper = new ProxyRequestHelper(); + ProxyRequestHelper helper = new ProxyRequestHelper(new ZuulProperties()); MultiValueMap headers = helper.buildZuulRequestHeaders(request); @@ -215,7 +217,7 @@ public class ProxyRequestHelperTests { MockHttpServletRequest request = new MockHttpServletRequest("", "/"); request.addHeader("content-encoding", "identity"); - ProxyRequestHelper helper = new ProxyRequestHelper(); + ProxyRequestHelper helper = new ProxyRequestHelper(new ZuulProperties()); MultiValueMap headers = helper.buildZuulRequestHeaders(request); @@ -229,7 +231,7 @@ public class ProxyRequestHelperTests { MockHttpServletRequest request = new MockHttpServletRequest("", "/"); request.addHeader("accept-encoding", "identity"); - ProxyRequestHelper helper = new ProxyRequestHelper(); + ProxyRequestHelper helper = new ProxyRequestHelper(new ZuulProperties()); MultiValueMap headers = helper.buildZuulRequestHeaders(request); @@ -238,6 +240,29 @@ public class ProxyRequestHelperTests { assertThat(acceptEncodings, contains("identity")); } + @Test + public void addHostHeader() { + MockHttpServletRequest request = new MockHttpServletRequest("", "/"); + request.addHeader("host", "foo.com"); + + ZuulProperties zuulProperties = new ZuulProperties(); + zuulProperties.setAddHostHeader(true); + ProxyRequestHelper helper = new ProxyRequestHelper(zuulProperties); + + MultiValueMap headers = helper.buildZuulRequestHeaders(request); + + List acceptEncodings = headers.get("host"); + assertThat(acceptEncodings, hasSize(1)); + assertThat(acceptEncodings, contains("foo.com")); + + zuulProperties.setAddHostHeader(false); + helper = new ProxyRequestHelper(zuulProperties); + headers = helper.buildZuulRequestHeaders(request); + + acceptEncodings = headers.get("host"); + assertNull(acceptEncodings); + } + @Test public void setResponseLowercase() throws IOException { MockHttpServletRequest request = new MockHttpServletRequest("POST", "/"); @@ -247,7 +272,7 @@ public class ProxyRequestHelperTests { context.setRequest(request); context.setResponse(response); - ProxyRequestHelper helper = new ProxyRequestHelper(); + ProxyRequestHelper helper = new ProxyRequestHelper(new ZuulProperties()); MultiValueMap headers = new HttpHeaders(); headers.add(HttpHeaders.CONTENT_ENCODING.toLowerCase(), "gzip"); @@ -265,7 +290,7 @@ public class ProxyRequestHelperTests { context.setRequest(request); context.setResponse(response); - ProxyRequestHelper helper = new ProxyRequestHelper(); + ProxyRequestHelper helper = new ProxyRequestHelper(new ZuulProperties()); MultiValueMap headers = new HttpHeaders(); headers.add(HttpHeaders.CONTENT_TYPE, "text/plain"); @@ -287,7 +312,7 @@ public class ProxyRequestHelperTests { context.setRequest(request); context.setResponse(response); - ProxyRequestHelper helper = new ProxyRequestHelper(); + ProxyRequestHelper helper = new ProxyRequestHelper(new ZuulProperties()); MultiValueMap headers = new HttpHeaders(); headers.add(HttpHeaders.CONTENT_ENCODING, "gzip"); @@ -302,7 +327,7 @@ public class ProxyRequestHelperTests { params.add("a", "1234"); params.add("b", "5678"); - String queryString = new ProxyRequestHelper().getQueryString(params); + String queryString = new ProxyRequestHelper(new ZuulProperties()).getQueryString(params); assertThat(queryString, is("?a=1234&b=5678")); } @@ -312,7 +337,7 @@ public class ProxyRequestHelperTests { MultiValueMap params = new LinkedMultiValueMap<>(); params.add("wsdl", ""); - String queryString = new ProxyRequestHelper().getQueryString(params); + String queryString = new ProxyRequestHelper(new ZuulProperties()).getQueryString(params); assertThat(queryString, is("?wsdl")); } @@ -322,7 +347,7 @@ public class ProxyRequestHelperTests { MultiValueMap params = new LinkedMultiValueMap<>(); params.add("foo", "weird#chars"); - String queryString = new ProxyRequestHelper().getQueryString(params); + String queryString = new ProxyRequestHelper(new ZuulProperties()).getQueryString(params); assertThat(queryString, is("?foo=weird%23chars")); } @@ -334,7 +359,7 @@ public class ProxyRequestHelperTests { params.add("foobar", "bam"); params.add("foo\fbar", "bat"); // form feed is the colon replacement char - String queryString = new ProxyRequestHelper().getQueryString(params); + String queryString = new ProxyRequestHelper(new ZuulProperties()).getQueryString(params); assertThat(queryString, is("?foo:bar=baz&foobar=bam&foo%0Cbar=bat")); } @@ -350,7 +375,7 @@ public class ProxyRequestHelperTests { context.setRequest(request); context.set(REQUEST_URI_KEY, decodedURI); - final String requestURI = new ProxyRequestHelper().buildZuulRequestURI(request); + final String requestURI = new ProxyRequestHelper(new ZuulProperties()).buildZuulRequestURI(request); assertThat(requestURI, equalTo(encodedURI)); } @@ -364,7 +389,7 @@ public class ProxyRequestHelperTests { context.setRequest(request); context.set(REQUEST_URI_KEY, decodedURI); - final String requestURI = new ProxyRequestHelper().buildZuulRequestURI(request); + final String requestURI = new ProxyRequestHelper(new ZuulProperties()).buildZuulRequestURI(request); assertThat(requestURI, equalTo(encodedURI)); } @@ -378,7 +403,7 @@ public class ProxyRequestHelperTests { RequestContext context = RequestContext.getCurrentContext(); context.set(REQUEST_URI_KEY, requestURI); - ProxyRequestHelper helper = new ProxyRequestHelper(); + ProxyRequestHelper helper = new ProxyRequestHelper(new ZuulProperties()); String uri = helper.buildZuulRequestURI(request); @@ -394,7 +419,7 @@ public class ProxyRequestHelperTests { RequestContext context = RequestContext.getCurrentContext(); context.set(REQUEST_URI_KEY, requestURI); - ProxyRequestHelper helper = new ProxyRequestHelper(); + ProxyRequestHelper helper = new ProxyRequestHelper(new ZuulProperties()); String uri = helper.buildZuulRequestURI(request); diff --git a/spring-cloud-netflix-zuul/src/test/java/org/springframework/cloud/netflix/zuul/filters/pre/PreDecorationFilterTests.java b/spring-cloud-netflix-zuul/src/test/java/org/springframework/cloud/netflix/zuul/filters/pre/PreDecorationFilterTests.java index 314abf441..ad1033901 100644 --- a/spring-cloud-netflix-zuul/src/test/java/org/springframework/cloud/netflix/zuul/filters/pre/PreDecorationFilterTests.java +++ b/spring-cloud-netflix-zuul/src/test/java/org/springframework/cloud/netflix/zuul/filters/pre/PreDecorationFilterTests.java @@ -28,6 +28,7 @@ import com.netflix.zuul.context.RequestContext; import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; import org.mockito.Mock; import org.springframework.cloud.client.discovery.DiscoveryClient; @@ -35,6 +36,8 @@ import org.springframework.cloud.netflix.zuul.filters.ProxyRequestHelper; import org.springframework.cloud.netflix.zuul.filters.ZuulProperties; import org.springframework.cloud.netflix.zuul.filters.ZuulProperties.ZuulRoute; import org.springframework.cloud.netflix.zuul.filters.discovery.DiscoveryClientRouteLocator; +import org.springframework.cloud.test.ClassPathExclusions; +import org.springframework.cloud.test.ModifiedClassPathRunner; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.util.MultiValueMap; @@ -50,6 +53,10 @@ import static org.springframework.cloud.netflix.zuul.filters.support.FilterConst /** * @author Dave Syer */ +@RunWith(ModifiedClassPathRunner.class) +//This is needed for sensitiveHeadersOverrideEmpty, if Spring Security is on the classpath +//then sensitive headers will always be present. +@ClassPathExclusions({"spring-security-*.jar"}) public class PreDecorationFilterTests { private PreDecorationFilter filter; @@ -69,6 +76,7 @@ public class PreDecorationFilterTests { public void init() { initMocks(this); this.properties = new ZuulProperties(); + this.proxyRequestHelper = new ProxyRequestHelper(properties); this.routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties); this.filter = new PreDecorationFilter(this.routeLocator, "/", this.properties, diff --git a/spring-cloud-netflix-zuul/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/RibbonRoutingFilterTests.java b/spring-cloud-netflix-zuul/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/RibbonRoutingFilterTests.java index 7a783d308..568fcdb4d 100644 --- a/spring-cloud-netflix-zuul/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/RibbonRoutingFilterTests.java +++ b/spring-cloud-netflix-zuul/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/RibbonRoutingFilterTests.java @@ -29,6 +29,7 @@ import org.junit.Test; import org.springframework.cloud.netflix.ribbon.support.RibbonCommandContext; import org.springframework.cloud.netflix.ribbon.support.RibbonRequestCustomizer; import org.springframework.cloud.netflix.zuul.filters.ProxyRequestHelper; +import org.springframework.cloud.netflix.zuul.filters.ZuulProperties; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -114,7 +115,7 @@ public class RibbonRoutingFilterTests { private void setupRibbonRoutingFilter() { RibbonCommandFactory factory = mock(RibbonCommandFactory.class); - filter = new RibbonRoutingFilter(new ProxyRequestHelper(), factory, Collections.emptyList()); + filter = new RibbonRoutingFilter(new ProxyRequestHelper(new ZuulProperties()), factory, Collections.emptyList()); } private ClientHttpResponse createClientHttpResponseWithNonStatus() { diff --git a/spring-cloud-netflix-zuul/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/SimpleHostRoutingFilterTests.java b/spring-cloud-netflix-zuul/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/SimpleHostRoutingFilterTests.java index 3d667623c..bb5817d77 100644 --- a/spring-cloud-netflix-zuul/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/SimpleHostRoutingFilterTests.java +++ b/spring-cloud-netflix-zuul/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/SimpleHostRoutingFilterTests.java @@ -652,7 +652,7 @@ public class SimpleHostRoutingFilterTests { SimpleHostRoutingFilter simpleHostRoutingFilter(ZuulProperties zuulProperties, ApacheHttpClientConnectionManagerFactory connectionManagerFactory, ApacheHttpClientFactory clientFactory) { - return new SimpleHostRoutingFilter(new ProxyRequestHelper(), zuulProperties, connectionManagerFactory, clientFactory); + return new SimpleHostRoutingFilter(new ProxyRequestHelper(zuulProperties), zuulProperties, connectionManagerFactory, clientFactory); } }