From dfcc319ba7e20b507a6b95dfef76cefb3850d0f5 Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Mon, 7 Nov 2016 16:11:41 -0500 Subject: [PATCH] Make Netflix Servlet 3.0.1 compatible. Fixes #1447 --- .../zuul/filters/post/SendResponseFilter.java | 24 +++++++++++++------ .../filters/pre/FormBodyWrapperFilter.java | 1 - .../filters/route/RibbonRoutingFilter.java | 15 +++++++----- 3 files changed, 26 insertions(+), 14 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 37ea21843..7cbf60be2 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 */ @@ -210,10 +207,23 @@ 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()) { + // To support Servlet API 3.0.1 we need to check if setcontentLengthLong exists + try { + HttpServletResponse.class.getMethod("setContentLengthLong"); + servletResponse.setContentLengthLong(contentLength); + } catch (NoSuchMethodException e) { + //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; + } + } 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 500ee5a23..5d597986f 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 86d9b940f..35a4c5816 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 { @@ -119,8 +116,14 @@ public class RibbonRoutingFilter extends ZuulFilter { // remove double slashes uri = uri.replace("//", "/"); + long contentLength = request.getContentLength(); + try { + HttpServletRequest.class.getMethod("getContentLengthLong"); + contentLength = request.getContentLengthLong(); + } catch (NoSuchMethodException e) {/*doesn't matter*/} + 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 {