From 14ad35539117ebca6fc775f0c92399382c2ff449 Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Wed, 21 Jan 2026 22:44:51 +1300 Subject: [PATCH] Fix `defer_stop` usage in `HTTP1::Server`. --- lib/async/http/protocol/http1/server.rb | 29 +++++++++++++------------ 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/lib/async/http/protocol/http1/server.rb b/lib/async/http/protocol/http1/server.rb index eff1517e..ca65e2c3 100644 --- a/lib/async/http/protocol/http1/server.rb +++ b/lib/async/http/protocol/http1/server.rb @@ -64,21 +64,22 @@ def each(task: Task.current) task.annotate("Reading #{self.version} requests for #{self.class}.") while request = next_request - if body = request.body - finishable = Finishable.new(body) - request.body = finishable - end - - response = yield(request, self) - version = request.version - body = response&.body - - if hijacked? - body&.close - return - end - + # We have received complete request (line + headers), so defer stop until the response is generated. task.defer_stop do + if body = request.body + finishable = Finishable.new(body) + request.body = finishable + end + + response = yield(request, self) + version = request.version + body = response&.body + + if hijacked? + body&.close + return + end + # If a response was generated, send it: if response trailer = response.headers.trailer!