summary refs log tree commit
diff options
context:
space:
mode:
authorJan Xie <jan.h.xie@gmail.com>2011-06-14 00:22:35 +0800
committerKonstantin Haase <konstantin.mailinglists@googlemail.com>2011-06-16 12:26:04 +0200
commit81a2a75e70d385eba98fb7d5d5a5c0bac732c64b (patch)
treeb3613ddc42dd83401a6eadd34f62237bb9ff8d21
parent069a89d3d64ecda3329fee58eae4f56bee24d2b5 (diff)
downloadrack-81a2a75e70d385eba98fb7d5d5a5c0bac732c64b.tar.gz
fix BodyProxy#close
Signed-off-by: Konstantin Haase <konstantin.mailinglists@googlemail.com>
-rw-r--r--lib/rack/body_proxy.rb16
-rw-r--r--test/spec_body_proxy.rb9
2 files changed, 21 insertions, 4 deletions
diff --git a/lib/rack/body_proxy.rb b/lib/rack/body_proxy.rb
index 51555478..0690e3c9 100644
--- a/lib/rack/body_proxy.rb
+++ b/lib/rack/body_proxy.rb
@@ -1,7 +1,7 @@
 module Rack
   class BodyProxy
     def initialize(body, &block)
-      @body, @block = body, block
+      @body, @block, @closed = body, block, false
     end
 
     def respond_to?(*args)
@@ -9,9 +9,17 @@ module Rack
     end
 
     def close
-      @body.close if @body.respond_to? :close
-    ensure
-      @block.call
+      return if closed?
+      begin
+        @body.close if @body.respond_to? :close
+      ensure
+        @block.call
+        @closed = true
+      end
+    end
+
+    def closed?
+      @closed
     end
 
     def method_missing(*args, &block)
diff --git a/test/spec_body_proxy.rb b/test/spec_body_proxy.rb
new file mode 100644
index 00000000..83bc414f
--- /dev/null
+++ b/test/spec_body_proxy.rb
@@ -0,0 +1,9 @@
+describe Rack::BodyProxy do
+  should 'not close more than one time' do
+    count = 0
+    proxy = Rack::BodyProxy.new([]) { count += 1 }
+    proxy.close
+    proxy.close
+    count.should == 1
+  end
+end