Skip to content

Commit 773b8d7

Browse files
samuel-williams-shopifyioquatix
authored andcommitted
Fix defer_stop usage in HTTP1::Server. (#215)
1 parent 71f4b15 commit 773b8d7

File tree

2 files changed

+19
-14
lines changed

2 files changed

+19
-14
lines changed

lib/async/http/protocol/http1/server.rb

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -64,21 +64,22 @@ def each(task: Task.current)
6464
task.annotate("Reading #{self.version} requests for #{self.class}.")
6565

6666
while request = next_request
67-
if body = request.body
68-
finishable = Finishable.new(body)
69-
request.body = finishable
70-
end
71-
72-
response = yield(request, self)
73-
version = request.version
74-
body = response&.body
75-
76-
if hijacked?
77-
body&.close
78-
return
79-
end
80-
67+
# We have received complete request (line + headers), so defer stop until the response is generated.
8168
task.defer_stop do
69+
if body = request.body
70+
finishable = Finishable.new(body)
71+
request.body = finishable
72+
end
73+
74+
response = yield(request, self)
75+
version = request.version
76+
body = response&.body
77+
78+
if hijacked?
79+
body&.close
80+
return
81+
end
82+
8283
# If a response was generated, send it:
8384
if response
8485
trailer = response.headers.trailer!

releases.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Releases
22

3+
## Unreleased
4+
5+
- Fix `defer_stop` usage in `HTTP1::Server`, improving server graceful shutdown behavior.
6+
37
## v0.94.0
48

59
- Propagate all errors from background reader to active streams so that they are closed correctly (e.g. errors are not missed).

0 commit comments

Comments
 (0)