From 459457e1aae8036e40c7f7956f647d6f790da608 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Mon, 8 May 2017 15:36:31 -0400 Subject: [PATCH] WebFilterChain delegation nested in Mono.defer() Issue: SPR-15520 --- .../server/handler/DefaultWebFilterChain.java | 18 ++++++++++-------- .../handler/FilteringWebHandlerTests.java | 4 ++-- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/web/server/handler/DefaultWebFilterChain.java b/spring-web/src/main/java/org/springframework/web/server/handler/DefaultWebFilterChain.java index 1b6c4526f1c..7650f28df73 100644 --- a/spring-web/src/main/java/org/springframework/web/server/handler/DefaultWebFilterChain.java +++ b/spring-web/src/main/java/org/springframework/web/server/handler/DefaultWebFilterChain.java @@ -68,14 +68,16 @@ public class DefaultWebFilterChain implements WebFilterChain { @Override public Mono filter(ServerWebExchange exchange) { - if (this.index < this.filters.size()) { - WebFilter filter = this.filters.get(this.index); - WebFilterChain chain = new DefaultWebFilterChain(this, this.index + 1); - return filter.filter(exchange, chain); - } - else { - return this.handler.handle(exchange); - } + return Mono.defer(() -> { + if (this.index < this.filters.size()) { + WebFilter filter = this.filters.get(this.index); + WebFilterChain chain = new DefaultWebFilterChain(this, this.index + 1); + return filter.filter(exchange, chain); + } + else { + return this.handler.handle(exchange); + } + }); } } diff --git a/spring-web/src/test/java/org/springframework/web/server/handler/FilteringWebHandlerTests.java b/spring-web/src/test/java/org/springframework/web/server/handler/FilteringWebHandlerTests.java index e1c2bf1ce2e..a6ad299c8df 100644 --- a/spring-web/src/test/java/org/springframework/web/server/handler/FilteringWebHandlerTests.java +++ b/spring-web/src/test/java/org/springframework/web/server/handler/FilteringWebHandlerTests.java @@ -104,7 +104,7 @@ public class FilteringWebHandlerTests { new FilteringWebHandler(targetHandler, Collections.singletonList(filter)) .handle(MockServerHttpRequest.get("/").toExchange()) - .block(Duration.ZERO); + .block(Duration.ofSeconds(5)); assertTrue(filter.invoked()); assertTrue(targetHandler.invoked()); @@ -170,7 +170,7 @@ public class FilteringWebHandlerTests { } private Mono doAsyncWork() { - return Mono.just("123"); + return Mono.delay(Duration.ofMillis(100L)).map(l -> "123"); } }