diff options
author | Jan Xie <jan.h.xie@gmail.com> | 2011-06-14 00:22:35 +0800 |
---|---|---|
committer | Konstantin Haase <konstantin.mailinglists@googlemail.com> | 2011-06-16 12:26:04 +0200 |
commit | 81a2a75e70d385eba98fb7d5d5a5c0bac732c64b (patch) | |
tree | b3613ddc42dd83401a6eadd34f62237bb9ff8d21 | |
parent | 069a89d3d64ecda3329fee58eae4f56bee24d2b5 (diff) | |
download | rack-81a2a75e70d385eba98fb7d5d5a5c0bac732c64b.tar.gz |
fix BodyProxy#close
Signed-off-by: Konstantin Haase <konstantin.mailinglists@googlemail.com>
-rw-r--r-- | lib/rack/body_proxy.rb | 16 | ||||
-rw-r--r-- | test/spec_body_proxy.rb | 9 |
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 |