diff options
author | James Tucker <jftucker@gmail.com> | 2013-04-22 08:38:11 -0700 |
---|---|---|
committer | James Tucker <jftucker@gmail.com> | 2013-04-22 08:38:11 -0700 |
commit | 7bda8d485b38403bf07f43793d37b66b7a8281d6 (patch) | |
tree | cfc9886fa3a8ecef958b6f99f2a44f6ad70a3e52 | |
parent | ba98d5f6697cd12122961aa49d84360ccaa446fc (diff) | |
download | rack-7bda8d485b38403bf07f43793d37b66b7a8281d6.tar.gz |
delfater: ensure that parent body is always closed
* Fixes a bug where body is not enumerated (i.e. HEAD), and as such is never closed. * Users suffering from the above bug are encouraged to investigate their middleware order. * Supersedes and closes #531.
-rw-r--r-- | lib/rack/deflater.rb | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/lib/rack/deflater.rb b/lib/rack/deflater.rb index 2531948e..1a5637c7 100644 --- a/lib/rack/deflater.rb +++ b/lib/rack/deflater.rb @@ -79,7 +79,7 @@ module Rack gzip.flush } ensure - @body.close if @body.respond_to?(:close) + close gzip.close @writer = nil end @@ -87,6 +87,12 @@ module Rack def write(data) @writer.call(data) end + + def close + return if @closed + @closed = true + @body.close if @body.respond_to?(:close) + end end class DeflateStream @@ -100,6 +106,7 @@ module Rack def initialize(body) @body = body + @closed = false end def each @@ -108,9 +115,15 @@ module Rack yield deflator.finish nil ensure - @body.close if @body.respond_to?(:close) + close deflator.close end + + def close + return if @closed + @closed = true + @body.close if @body.respond_to?(:close) + end end end end |