From db4c573c9095570de0510eade9aac1f8dab349b7 Mon Sep 17 00:00:00 2001 From: Jonas Konrad Date: Fri, 28 Apr 2023 12:19:13 +0200 Subject: [PATCH] Await completion in ServletHttpHandler.service for non-async containers (#438) This patch only returns from service once the request has actually completed, and the response is guaranteed to be available. This fixes https://github.com/micronaut-projects/micronaut-starter/pull/1734 . There may be adverse impact, I'm not sure. --- .../servlet/http/ServletHttpHandler.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/servlet-core/src/main/java/io/micronaut/servlet/http/ServletHttpHandler.java b/servlet-core/src/main/java/io/micronaut/servlet/http/ServletHttpHandler.java index f967af31a..e3fbba2e1 100644 --- a/servlet-core/src/main/java/io/micronaut/servlet/http/ServletHttpHandler.java +++ b/servlet-core/src/main/java/io/micronaut/servlet/http/ServletHttpHandler.java @@ -66,6 +66,8 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; import java.util.function.Consumer; import java.util.stream.Collectors; @@ -211,8 +213,22 @@ public void service(ServletExchange exchange) { })); }); } else { + CompletableFuture termination = new CompletableFuture<>(); lc.handleNormal() - .onComplete((response, throwable) -> onComplete(exchange, req, response, throwable, requestTerminated)); + .onComplete((response, throwable) -> { + try { + onComplete(exchange, req, response, throwable, requestTerminated); + } finally { + termination.complete(null); + } + }); + try { + termination.get(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } catch (ExecutionException e) { + throw new AssertionError("we only call complete, shouldn't happen", e); + } } }