summary refs log tree commit
diff options
context:
space:
mode:
authorVais Salikhov <vsalikhov@gmail.com>2014-11-03 18:33:45 +0700
committerVais Salikhov <vsalikhov@gmail.com>2014-11-03 18:33:45 +0700
commita86456447d7de0a14decb5f8bda7c7a402b2e195 (patch)
tree079c198b194fdd9d0167cbbf8ec9ab06ff399482
parent575bbcba780d9ba71f173921aa1fcb024890b867 (diff)
downloadrack-a86456447d7de0a14decb5f8bda7c7a402b2e195.tar.gz
Avoid WEBrick handler buffering the entire response in RAM
-rw-r--r--lib/rack/handler/webrick.rb21
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