Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
ioquatix committed Sep 2, 2024
1 parent 8523d4f commit 9dffa99
Showing 1 changed file with 21 additions and 17 deletions.
38 changes: 21 additions & 17 deletions lib/async/http/protocol/http1/server.rb
Original file line number Diff line number Diff line change
Expand Up @@ -59,33 +59,37 @@ def each(task: Task.current)
if response
trailer = response.headers.trailer!

write_response(@version, response.status, response.headers)

# Some operations in this method are long running, that is, it's expected that `body.call(stream)` could literally run indefinitely. In order to facilitate garbage collection, we want to nullify as many local variables before calling the streaming body. This ensures that the garbage collection can clean up as much state as possible during the long running operation, so we don't retain objects that are no longer needed.

if body and protocol = response.protocol
# We force a 101 response if the protocol is upgraded - HTTP/2 CONNECT will return 200 for success, but this won't be understood by HTTP/1 clients:
write_response(@version, 101, response.headers)

stream = write_upgrade_body(protocol)

# At this point, the request body is hijacked, so we don't want to call #finish below.
request = response = nil

body.call(stream)
elsif request.connect? and response.success?
stream = write_tunnel_body(request.version)

# Same as above:
request = response = nil

body.call(stream)
else
head = request.head?
version = request.version

# Same as above:
request = nil unless request.body
response = nil
write_response(@version, response.status, response.headers)

write_body(version, body, head, trailer)
if request.connect? and response.success?
stream = write_tunnel_body(request.version)

# Same as above:
request = response = nil

body.call(stream)
else
head = request.head?
version = request.version

# Same as above:
request = response = nil

write_body(version, body, head, trailer)
end
end

# We are done with the body, you shouldn't need to call close on it:
Expand Down

0 comments on commit 9dffa99

Please sign in to comment.