From 1fe28af3f0654f0d040ea90a0b175b2d892061ff Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Tue, 20 Oct 2015 06:44:01 -0400 Subject: [PATCH] Fix issue with forward:... routes We have to ensure that the ZuulController is not mapped on a forward otherwise we just go back through the same code path and render nothing. --- .../cloud/netflix/zuul/ZuulConfiguration.java | 2 +- .../zuul/filters/{post => route}/SendForwardFilter.java | 7 ++++--- .../cloud/netflix/zuul/web/ZuulHandlerMapping.java | 6 ++++++ .../netflix/zuul/filters/post/SendForwardFilterTests.java | 1 + 4 files changed, 12 insertions(+), 4 deletions(-) rename spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/{post => route}/SendForwardFilter.java (93%) diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulConfiguration.java index 10249d89..71245206 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulConfiguration.java @@ -29,11 +29,11 @@ import org.springframework.cloud.netflix.zuul.filters.RouteLocator; import org.springframework.cloud.netflix.zuul.filters.SimpleRouteLocator; import org.springframework.cloud.netflix.zuul.filters.ZuulProperties; import org.springframework.cloud.netflix.zuul.filters.post.SendErrorFilter; -import org.springframework.cloud.netflix.zuul.filters.post.SendForwardFilter; import org.springframework.cloud.netflix.zuul.filters.post.SendResponseFilter; import org.springframework.cloud.netflix.zuul.filters.pre.DebugFilter; import org.springframework.cloud.netflix.zuul.filters.pre.FormBodyWrapperFilter; import org.springframework.cloud.netflix.zuul.filters.pre.Servlet30WrapperFilter; +import org.springframework.cloud.netflix.zuul.filters.route.SendForwardFilter; import org.springframework.cloud.netflix.zuul.web.ZuulController; import org.springframework.cloud.netflix.zuul.web.ZuulHandlerMapping; import org.springframework.context.ApplicationEvent; diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/post/SendForwardFilter.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/SendForwardFilter.java similarity index 93% rename from spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/post/SendForwardFilter.java rename to spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/SendForwardFilter.java index 0b1e77ce..e4163d29 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/post/SendForwardFilter.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/SendForwardFilter.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.netflix.zuul.filters.post; +package org.springframework.cloud.netflix.zuul.filters.route; import javax.servlet.RequestDispatcher; @@ -32,12 +32,12 @@ public class SendForwardFilter extends ZuulFilter { @Override public String filterType() { - return "post"; + return "route"; } @Override public int filterOrder() { - return 2000; + return 500; } @Override @@ -57,6 +57,7 @@ public class SendForwardFilter extends ZuulFilter { ctx.set(SEND_FORWARD_FILTER_RAN, true); if (!ctx.getResponse().isCommitted()) { dispatcher.forward(ctx.getRequest(), ctx.getResponse()); + ctx.getResponse().flushBuffer(); } } } diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/web/ZuulHandlerMapping.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/web/ZuulHandlerMapping.java index f4273276..5e99bae7 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/web/ZuulHandlerMapping.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/web/ZuulHandlerMapping.java @@ -25,6 +25,8 @@ import org.springframework.cloud.netflix.zuul.filters.RouteLocator; import org.springframework.util.PatternMatchUtils; import org.springframework.web.servlet.handler.AbstractUrlHandlerMapping; +import com.netflix.zuul.context.RequestContext; + /** * MVC HandlerMapping that maps incoming request paths to remote services. * @@ -60,6 +62,10 @@ public class ZuulHandlerMapping extends AbstractUrlHandlerMapping { if (PatternMatchUtils.simpleMatch(ignored, urlPath)) { return null; } + RequestContext ctx = RequestContext.getCurrentContext(); + if (ctx.containsKey("forward.to")) { + return null; + } return super.lookupHandler(urlPath, request); } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/post/SendForwardFilterTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/post/SendForwardFilterTests.java index c66c1010..29bd803b 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/post/SendForwardFilterTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/post/SendForwardFilterTests.java @@ -23,6 +23,7 @@ import javax.servlet.http.HttpServletRequest; import org.junit.After; import org.junit.Test; +import org.springframework.cloud.netflix.zuul.filters.route.SendForwardFilter; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse;