diff options
author | Vais Salikhov <vsalikhov@gmail.com> | 2014-11-03 18:33:45 +0700 |
---|---|---|
committer | Vais Salikhov <vsalikhov@gmail.com> | 2014-11-03 18:33:45 +0700 |
commit | a86456447d7de0a14decb5f8bda7c7a402b2e195 (patch) | |
tree | 079c198b194fdd9d0167cbbf8ec9ab06ff399482 | |
parent | 575bbcba780d9ba71f173921aa1fcb024890b867 (diff) | |
download | rack-a86456447d7de0a14decb5f8bda7c7a402b2e195.tar.gz |
Avoid WEBrick handler buffering the entire response in RAM
-rw-r--r-- | lib/rack/handler/webrick.rb | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/lib/rack/handler/webrick.rb b/lib/rack/handler/webrick.rb index dcbf96ca..e96dce9a 100644 --- a/lib/rack/handler/webrick.rb +++ b/lib/rack/handler/webrick.rb @@ -108,9 +108,13 @@ module Rack res.chunked = true io_lambda.call wr else - body.each { |part| - res.body << part - } + if res['content-length'].nil? + body.each { |part| res.body << part } + else + res.body = proc do |socket| + body.each { |part| socket << part } + end + end end ensure body.close if body.respond_to? :close @@ -119,3 +123,14 @@ module Rack end end end +module WEBrick + class HTTPResponse + alias :overridden_send_body :send_body + def send_body(socket) + case @body + when Proc then @body.call(socket) + else overridden_send_body(socket) + end + end + end +end |