diff --git a/lib/puma/request.rb b/lib/puma/request.rb index 948992895f..698cea68de 100644 --- a/lib/puma/request.rb +++ b/lib/puma/request.rb @@ -167,11 +167,16 @@ def handle_request(client, lines, requests) end ensure - uncork_socket io - - body.close - client.tempfile.unlink if client.tempfile - res_body.close if res_body.respond_to? :close + begin + uncork_socket io + + body.close + client.tempfile.unlink if client.tempfile + ensure + # Whatever happens, we MUST call `close` on the response body. + # Otherwise Rack::BodyProxy callbacks may not fire and lead to various state leaks + res_body.close if res_body.respond_to? :close + end after_reply.each { |o| o.call } end