From 2e46bdf9d2da042155ee0fa5f9f802b76b462f72 Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Mon, 12 Dec 2016 15:09:16 -0500 Subject: [PATCH] Porting #1450 for Dalston release --- .../zuul/filters/post/SendResponseFilter.java | 39 ++++++++++++++----- .../filters/pre/FormBodyWrapperFilter.java | 1 - .../filters/route/RibbonRoutingFilter.java | 22 +++++++---- 3 files changed, 43 insertions(+), 19 deletions(-) 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 37ea2184..7c846571 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 @@ -16,17 +16,16 @@ package org.springframework.cloud.netflix.zuul.filters.post; +import lombok.extern.apachecommons.CommonsLog; + import java.io.ByteArrayInputStream; import java.io.IOException; 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; - import com.netflix.config.DynamicBooleanProperty; import com.netflix.config.DynamicIntProperty; import com.netflix.config.DynamicPropertyFactory; @@ -37,8 +36,6 @@ 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 */ @@ -56,6 +53,17 @@ public class SendResponseFilter extends ZuulFilter { private static DynamicBooleanProperty SET_CONTENT_LENGTH = DynamicPropertyFactory .getInstance() .getBooleanProperty(ZuulConstants.ZUUL_SET_CONTENT_LENGTH, false); + private boolean useServlet31 = true; + + public SendResponseFilter() { + super(); + // To support Servlet API 3.0.1 we need to check if setcontentLengthLong exists + try { + HttpServletResponse.class.getMethod("setContentLengthLong"); + } catch(NoSuchMethodException e) { + useServlet31 = false; + } + } @Override public String filterType() { @@ -137,8 +145,8 @@ public class SendResponseFilter extends ZuulFilter { "gzip expected but not " + "received assuming unencoded response " + RequestContext.getCurrentContext() - .getRequest().getRequestURL() - .toString()); + .getRequest().getRequestURL() + .toString()); inputStream = is; } } @@ -210,10 +218,21 @@ public class SendResponseFilter extends ZuulFilter { // Only inserts Content-Length if origin provides it and origin response is not // gzipped if (SET_CONTENT_LENGTH.get()) { - if (contentLength != null && !ctx.getResponseGZipped()) { - servletResponse.setContentLengthLong(contentLength); + if ( contentLength != null && !ctx.getResponseGZipped()) { + if(useServlet31) { + servletResponse.setContentLengthLong(contentLength); + } else { + //Try and set some kind of content length if we can safely convert the Long to an int + if (isLongSafe(contentLength)) { + servletResponse.setContentLength(contentLength.intValue()); + } + } } } } -} + private boolean isLongSafe(long value) { + return value <= Integer.MAX_VALUE && value >= Integer.MIN_VALUE; + } + +} \ No newline at end of file diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/pre/FormBodyWrapperFilter.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/pre/FormBodyWrapperFilter.java index 500ee5a2..5d597986 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/pre/FormBodyWrapperFilter.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/pre/FormBodyWrapperFilter.java @@ -170,7 +170,6 @@ public class FormBodyWrapperFilter extends ZuulFilter { return this.contentLength; } - @Override public long getContentLengthLong() { return getContentLength(); } diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/RibbonRoutingFilter.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/RibbonRoutingFilter.java index 86d9b940..fabbf543 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/RibbonRoutingFilter.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/RibbonRoutingFilter.java @@ -16,28 +16,25 @@ package org.springframework.cloud.netflix.zuul.filters.route; +import lombok.extern.apachecommons.CommonsLog; + import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.Map; - import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; - import org.springframework.cloud.netflix.ribbon.support.RibbonRequestCustomizer; import org.springframework.cloud.netflix.zuul.filters.ProxyRequestHelper; import org.springframework.http.HttpStatus; import org.springframework.http.client.ClientHttpResponse; import org.springframework.util.MultiValueMap; - import com.netflix.client.ClientException; import com.netflix.hystrix.exception.HystrixRuntimeException; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException; -import lombok.extern.apachecommons.CommonsLog; - @CommonsLog public class RibbonRoutingFilter extends ZuulFilter { @@ -45,13 +42,20 @@ public class RibbonRoutingFilter extends ZuulFilter { protected ProxyRequestHelper helper; protected RibbonCommandFactory ribbonCommandFactory; protected List requestCustomizers; + private boolean useServlet31 = true; public RibbonRoutingFilter(ProxyRequestHelper helper, - RibbonCommandFactory ribbonCommandFactory, - List requestCustomizers) { + RibbonCommandFactory ribbonCommandFactory, + List requestCustomizers) { this.helper = helper; this.ribbonCommandFactory = ribbonCommandFactory; this.requestCustomizers = requestCustomizers; + // To support Servlet API 3.0.1 we need to check if getcontentLengthLong exists + try { + HttpServletResponse.class.getMethod("getContentLengthLong"); + } catch(NoSuchMethodException e) { + useServlet31 = false; + } } public RibbonRoutingFilter(RibbonCommandFactory ribbonCommandFactory) { @@ -119,8 +123,10 @@ public class RibbonRoutingFilter extends ZuulFilter { // remove double slashes uri = uri.replace("//", "/"); + long contentLength = useServlet31 ? request.getContentLengthLong(): request.getContentLength(); + return new RibbonCommandContext(serviceId, verb, uri, retryable, headers, params, - requestEntity, this.requestCustomizers, request.getContentLengthLong()); + requestEntity, this.requestCustomizers, contentLength); } protected ClientHttpResponse forward(RibbonCommandContext context) throws Exception {