diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultAsyncServerResponse.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultAsyncServerResponse.java index 065745bec96..1ba7faf03cc 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultAsyncServerResponse.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultAsyncServerResponse.java @@ -115,8 +115,11 @@ final class DefaultAsyncServerResponse extends ErrorHandlingServerResponse imple throws ServletException, IOException { WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request); - AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response); - asyncManager.setAsyncWebRequest(asyncWebRequest); + AsyncWebRequest asyncWebRequest = asyncManager.getAsyncWebRequest(); + if (asyncWebRequest == null) { + asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response); + asyncManager.setAsyncWebRequest(asyncWebRequest); + } try { asyncManager.startDeferredResultProcessing(deferredResult); } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/function/DefaultAsyncServerResponseTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/function/DefaultAsyncServerResponseTests.java index 1a4d53b92f1..b0fead91860 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/function/DefaultAsyncServerResponseTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/function/DefaultAsyncServerResponseTests.java @@ -18,15 +18,43 @@ package org.springframework.web.servlet.function; import java.util.concurrent.CompletableFuture; +import jakarta.servlet.AsyncContext; import org.junit.jupiter.api.Test; +import org.springframework.web.context.request.async.AsyncWebRequest; +import org.springframework.web.context.request.async.DeferredResult; +import org.springframework.web.context.request.async.WebAsyncManager; +import org.springframework.web.context.request.async.WebAsyncUtils; +import org.springframework.web.testfixture.servlet.MockHttpServletRequest; +import org.springframework.web.testfixture.servlet.MockHttpServletResponse; + import static org.assertj.core.api.Assertions.assertThat; /** + * Tests for {@link DefaultAsyncServerResponse}. * @author Arjen Poutsma */ class DefaultAsyncServerResponseTests { + @Test + void writeAsyncReusesExistingAsyncWebRequestTimeout() throws Exception { + MockHttpServletRequest request = new MockHttpServletRequest("GET", "/"); + request.setAsyncSupported(true); + MockHttpServletResponse response = new MockHttpServletResponse(); + + AsyncWebRequest existingAsyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response); + existingAsyncWebRequest.setTimeout(1000L); + WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request); + asyncManager.setAsyncWebRequest(existingAsyncWebRequest); + + DeferredResult deferredResult = new DeferredResult<>(); + DefaultAsyncServerResponse.writeAsync(request, response, deferredResult); + + assertThat(asyncManager.getAsyncWebRequest()).isSameAs(existingAsyncWebRequest); + AsyncContext asyncContext = request.getAsyncContext(); + assertThat(asyncContext.getTimeout()).isEqualTo(1000L); + } + @Test void blockCompleted() { ServerResponse wrappee = ServerResponse.ok().build();