diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ProxyRequestHelper.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ProxyRequestHelper.java index 1aed72d0..e1e9ef8f 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ProxyRequestHelper.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ProxyRequestHelper.java @@ -43,6 +43,9 @@ import com.netflix.zuul.util.HTTPRequestUtils; import lombok.extern.apachecommons.CommonsLog; +import static org.springframework.http.HttpHeaders.CONTENT_ENCODING; +import static org.springframework.http.HttpHeaders.CONTENT_LENGTH; + /** * @author Dave Syer */ @@ -55,8 +58,6 @@ public class ProxyRequestHelper { */ public static final String IGNORED_HEADERS = "ignoredHeaders"; - public static final String CONTENT_ENCODING = "Content-Encoding"; - private TraceRepository traces; public void setTraces(TraceRepository traces) { @@ -122,15 +123,23 @@ public class ProxyRequestHelper { } public void setResponse(int status, InputStream entity, - MultiValueMap headers) throws IOException { + MultiValueMap headers) throws IOException { RequestContext context = RequestContext.getCurrentContext(); - RequestContext.getCurrentContext().setResponseStatusCode(status); + context.setResponseStatusCode(status); if (entity != null) { - RequestContext.getCurrentContext().setResponseDataStream(entity); + context.setResponseDataStream(entity); + } + + HttpHeaders httpHeaders = new HttpHeaders(); + for (Entry> header : headers.entrySet()) { + List values = header.getValue(); + for (String value : values) { + httpHeaders.add(header.getKey(), value); + } } boolean isOriginResponseGzipped = false; - if (headers.containsKey(CONTENT_ENCODING)) { - Collection collection = headers.get(CONTENT_ENCODING); + if (httpHeaders.containsKey(CONTENT_ENCODING)) { + List collection = httpHeaders.get(CONTENT_ENCODING); for (String header : collection) { if (HTTPRequestUtils.getInstance().isGzipped(header)) { isOriginResponseGzipped = true; @@ -139,16 +148,16 @@ public class ProxyRequestHelper { } } context.setResponseGZipped(isOriginResponseGzipped); + for (Entry> header : headers.entrySet()) { - RequestContext ctx = RequestContext.getCurrentContext(); String name = header.getKey(); for (String value : header.getValue()) { - ctx.addOriginResponseHeader(name, value); - if (name.equalsIgnoreCase("content-length")) { - ctx.setOriginContentLength(value); + context.addOriginResponseHeader(name, value); + if (name.equalsIgnoreCase(CONTENT_LENGTH)) { + context.setOriginContentLength(value); } if (isIncludedHeader(name)) { - ctx.addZuulResponseHeader(name, value); + context.addZuulResponseHeader(name, value); } } } @@ -176,21 +185,21 @@ public class ProxyRequestHelper { } } switch (name) { - case "host": - case "connection": - case "content-length": - case "content-encoding": - case "server": - case "transfer-encoding": - return false; - default: - return true; + case "host": + case "connection": + case "content-length": + case "content-encoding": + case "server": + case "transfer-encoding": + return false; + default: + return true; } } public Map debug(String verb, String uri, - MultiValueMap headers, MultiValueMap params, - InputStream requestEntity) throws IOException { + MultiValueMap headers, MultiValueMap params, + InputStream requestEntity) throws IOException { Map info = new LinkedHashMap(); if (this.traces != null) { RequestContext context = RequestContext.getCurrentContext(); @@ -233,7 +242,7 @@ public class ProxyRequestHelper { } public void appendDebug(Map info, int status, - MultiValueMap headers) { + MultiValueMap headers) { if (this.traces != null) { @SuppressWarnings("unchecked") Map trace = (Map) info.get("headers"); @@ -267,3 +276,4 @@ public class ProxyRequestHelper { } } + diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/post/SendResponseFilter.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/post/SendResponseFilter.java index f92b716e..e89c98e4 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/post/SendResponseFilter.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/post/SendResponseFilter.java @@ -22,7 +22,6 @@ import java.io.InputStream; import java.io.OutputStream; import java.util.List; import java.util.zip.GZIPInputStream; - import javax.servlet.http.HttpServletResponse; import org.springframework.util.ReflectionUtils; @@ -35,10 +34,14 @@ import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.constants.ZuulConstants; import com.netflix.zuul.constants.ZuulHeaders; import com.netflix.zuul.context.RequestContext; +import com.netflix.zuul.util.HTTPRequestUtils; + +import lombok.extern.apachecommons.CommonsLog; /** * @author Spencer Gibb */ +@CommonsLog public class SendResponseFilter extends ZuulFilter { private static DynamicBooleanProperty INCLUDE_DEBUG_HEADER = DynamicPropertyFactory @@ -101,7 +104,9 @@ public class SendResponseFilter extends ZuulFilter { boolean isGzipRequested = false; final String requestEncoding = context.getRequest().getHeader( ZuulHeaders.ACCEPT_ENCODING); - if (requestEncoding != null && requestEncoding.equals("gzip")) { + + if (requestEncoding != null + && HTTPRequestUtils.getInstance().isGzipped(requestEncoding)) { isGzipRequested = true; } is = context.getResponseDataStream(); @@ -117,8 +122,8 @@ public class SendResponseFilter extends ZuulFilter { inputStream = new GZIPInputStream(is); } catch (java.util.zip.ZipException ex) { - System.out.println("gzip expected but not " - + "received assuming unencoded response" + log.debug("gzip expected but not " + + "received assuming unencoded response " + RequestContext.getCurrentContext().getRequest() .getRequestURL().toString()); inputStream = is; diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/ProxyRequestHelperTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/ProxyRequestHelperTests.java index fda67fa9..d79f64e1 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/ProxyRequestHelperTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/ProxyRequestHelperTests.java @@ -16,15 +16,7 @@ package org.springframework.cloud.netflix.zuul.filters; -import static org.hamcrest.Matchers.contains; -import static org.hamcrest.Matchers.equalTo; -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.assertThat; -import static org.mockito.MockitoAnnotations.initMocks; - +import java.io.IOException; import java.util.List; import org.junit.Before; @@ -33,12 +25,24 @@ import org.mockito.Mock; import org.springframework.boot.actuate.trace.InMemoryTraceRepository; import org.springframework.boot.actuate.trace.Trace; import org.springframework.boot.actuate.trace.TraceRepository; +import org.springframework.http.HttpHeaders; import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import com.netflix.zuul.context.RequestContext; +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.equalTo; +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.assertThat; +import static org.junit.Assert.assertTrue; +import static org.mockito.MockitoAnnotations.initMocks; + /** * @author Spencer Gibb */ @@ -71,7 +75,7 @@ public class ProxyRequestHelperTests { new LinkedMultiValueMap(), request.getInputStream()); Trace actual = this.traceRepository.findAll().get(0); System.err.println(actual.getInfo()); - assertThat((String)actual.getInfo().get("body"), equalTo("{}")); + assertThat((String) actual.getInfo().get("body"), equalTo("{}")); } @@ -112,4 +116,45 @@ public class ProxyRequestHelperTests { assertThat(acceptEncodings, contains("gzip")); } + @Test + public void setResponseLowercase() throws IOException { + MockHttpServletRequest request = new MockHttpServletRequest("POST", "/"); + MockHttpServletResponse response = new MockHttpServletResponse(); + + RequestContext context = RequestContext.getCurrentContext(); + context.setRequest(request); + context.setResponse(response); + + ProxyRequestHelper helper = new ProxyRequestHelper(); + + MultiValueMap headers = new HttpHeaders(); + headers.add(HttpHeaders.CONTENT_ENCODING.toLowerCase(), "gzip"); + + helper.setResponse( + 200, + request.getInputStream(), + headers); + assertTrue(context.getResponseGZipped()); + } + + @Test + public void setResponseUppercase() throws IOException { + MockHttpServletRequest request = new MockHttpServletRequest("POST", "/"); + MockHttpServletResponse response = new MockHttpServletResponse(); + + RequestContext context = RequestContext.getCurrentContext(); + context.setRequest(request); + context.setResponse(response); + + ProxyRequestHelper helper = new ProxyRequestHelper(); + + MultiValueMap headers = new HttpHeaders(); + headers.add(HttpHeaders.CONTENT_ENCODING, "gzip"); + + helper.setResponse( + 200, + request.getInputStream(), + headers); + assertTrue(context.getResponseGZipped()); + } }