diff --git a/docs/README.adoc b/docs/README.adoc index 96ad0a3d7..cdeb4d8f5 100644 --- a/docs/README.adoc +++ b/docs/README.adoc @@ -88,7 +88,7 @@ credentials and you already have those. The projects that require middleware generally include a `docker-compose.yml`, so consider using -https://compose.docker.io/[Docker Compose] to run the middeware servers +https://docs.docker.com/compose/[Docker Compose] to run the middeware servers in Docker containers. See the README in the https://github.com/spring-cloud-samples/scripts[scripts demo repository] for specific instructions about the common cases of mongo, diff --git a/spring-cloud-netflix-eureka-server/src/main/resources/static/eureka/fonts/montserrat-webfont.svg b/spring-cloud-netflix-eureka-server/src/main/resources/static/eureka/fonts/montserrat-webfont.svg index 7bd96bdfd..51fb329e3 100644 --- a/spring-cloud-netflix-eureka-server/src/main/resources/static/eureka/fonts/montserrat-webfont.svg +++ b/spring-cloud-netflix-eureka-server/src/main/resources/static/eureka/fonts/montserrat-webfont.svg @@ -1,5 +1,5 @@ - + diff --git a/spring-cloud-netflix-eureka-server/src/main/resources/static/eureka/fonts/varela_round-webfont.svg b/spring-cloud-netflix-eureka-server/src/main/resources/static/eureka/fonts/varela_round-webfont.svg index 3280e2c43..d45f3183c 100644 --- a/spring-cloud-netflix-eureka-server/src/main/resources/static/eureka/fonts/varela_round-webfont.svg +++ b/spring-cloud-netflix-eureka-server/src/main/resources/static/eureka/fonts/varela_round-webfont.svg @@ -1,5 +1,5 @@ - + diff --git a/spring-cloud-netflix-zuul/src/main/java/org/springframework/cloud/netflix/zuul/filters/post/SendResponseFilter.java b/spring-cloud-netflix-zuul/src/main/java/org/springframework/cloud/netflix/zuul/filters/post/SendResponseFilter.java index c80cfd718..f87619b0a 100644 --- a/spring-cloud-netflix-zuul/src/main/java/org/springframework/cloud/netflix/zuul/filters/post/SendResponseFilter.java +++ b/spring-cloud-netflix-zuul/src/main/java/org/springframework/cloud/netflix/zuul/filters/post/SendResponseFilter.java @@ -129,6 +129,7 @@ public class SendResponseFilter extends ZuulFilter { servletResponse.setCharacterEncoding("UTF-8"); } + String servletResponseContentEncoding = getResponseContentEncoding(context); OutputStream outStream = servletResponse.getOutputStream(); InputStream is = null; try { @@ -144,13 +145,18 @@ public class SendResponseFilter extends ZuulFilter { // decompress stream before sending to client // else, stream gzip directly to client if (isGzipRequested(context)) { - servletResponse.setHeader(ZuulHeaders.CONTENT_ENCODING, "gzip"); + servletResponseContentEncoding = "gzip"; } else { + servletResponseContentEncoding = null; is = handleGzipStream(is); } } } + if (servletResponseContentEncoding != null) { + servletResponse.setHeader(ZuulHeaders.CONTENT_ENCODING, + servletResponseContentEncoding); + } if (is != null) { writeResponse(is, outStream); @@ -230,6 +236,18 @@ public class SendResponseFilter extends ZuulFilter { && HTTPRequestUtils.getInstance().isGzipped(requestEncoding); } + private String getResponseContentEncoding(RequestContext context) { + List> zuulResponseHeaders = context.getZuulResponseHeaders(); + if (zuulResponseHeaders != null) { + for (Pair it : zuulResponseHeaders) { + if (ZuulHeaders.CONTENT_ENCODING.equalsIgnoreCase(it.first())) { + return it.second(); + } + } + } + return null; + } + private void writeResponse(InputStream zin, OutputStream out) throws Exception { byte[] bytes = buffers.get(); int bytesRead = -1; @@ -255,7 +273,9 @@ public class SendResponseFilter extends ZuulFilter { List> zuulResponseHeaders = context.getZuulResponseHeaders(); if (zuulResponseHeaders != null) { for (Pair it : zuulResponseHeaders) { - servletResponse.addHeader(it.first(), it.second()); + if (!ZuulHeaders.CONTENT_ENCODING.equalsIgnoreCase(it.first())) { + servletResponse.addHeader(it.first(), it.second()); + } } } if (includeContentLengthHeader(context)) { diff --git a/spring-cloud-netflix-zuul/src/test/java/org/springframework/cloud/netflix/zuul/filters/post/SendResponseFilterTests.java b/spring-cloud-netflix-zuul/src/test/java/org/springframework/cloud/netflix/zuul/filters/post/SendResponseFilterTests.java index 58d6d5595..1c29ae8ba 100644 --- a/spring-cloud-netflix-zuul/src/test/java/org/springframework/cloud/netflix/zuul/filters/post/SendResponseFilterTests.java +++ b/spring-cloud-netflix-zuul/src/test/java/org/springframework/cloud/netflix/zuul/filters/post/SendResponseFilterTests.java @@ -128,6 +128,29 @@ public class SendResponseFilterTests { assertThat(contentLength).as("wrong origin content length").isEqualTo("6"); } + /* + * Unknown encoding requested and NOT a GZip response -> Content-Length forwarded asis + */ + @Test + public void runWithOriginContentLength_content_encoding_header() throws Exception { + ZuulProperties properties = new ZuulProperties(); + properties.setSetContentLength(true); + + SendResponseFilter filter = createFilter(properties, "hello", null, + new MockHttpServletResponse(), false); + RequestContext.getCurrentContext().addZuulResponseHeader("Content-Encoding", + "unknown"); + RequestContext.getCurrentContext().setOriginContentLength(6L); // for test + RequestContext.getCurrentContext().setResponseGZipped(false); + filter.run(); + + MockHttpServletResponse response = (MockHttpServletResponse) RequestContext + .getCurrentContext().getResponse(); + assertThat(response.getHeader("Content-Length")).as("wrong origin content length") + .isEqualTo("6"); + assertThat(response.getHeader("Content-Encoding")).isEqualTo("unknown"); + } + /* * GZip requested and GZip response -> Content-Length forwarded asis, response * compressed @@ -193,6 +216,37 @@ public class SendResponseFilterTests { assertThat(response.getContentAsString()).as("wrong content").isEqualTo("hello"); } + /* + * GZip NOT requested and GZip response -> Content-Length discarded and response + * uncompressed + */ + @Test + public void runWithOriginContentLength_gzipNotRequested_gzipResponse_content_encoding_header() + throws Exception { + ZuulProperties properties = new ZuulProperties(); + properties.setSetContentLength(true); + + SendResponseFilter filter = new SendResponseFilter(properties); + + byte[] gzipData = gzipData("hello"); + + RequestContext.getCurrentContext().addZuulResponseHeader("Content-Encoding", + "gzip"); + RequestContext.getCurrentContext().setOriginContentLength((long) gzipData.length); // for + // test + RequestContext.getCurrentContext().setResponseGZipped(true); + RequestContext.getCurrentContext() + .setResponseDataStream(new ByteArrayInputStream(gzipData)); + + filter.run(); + + MockHttpServletResponse response = (MockHttpServletResponse) RequestContext + .getCurrentContext().getResponse(); + assertThat(response.getHeader("Content-Length")).isNull(); + assertThat(response.getHeader("Content-Encoding")).isNull(); + assertThat(response.getContentAsString()).as("wrong content").isEqualTo("hello"); + } + /* * Origin sends a non gzip response with Content-Encoding: gzip Request does not * support GZIP -> filter fails to uncompress and send stream "asis". Content-Length