summary refs log tree commit
diff options
context:
space:
mode:
authorJames Tucker <jftucker@gmail.com>2013-04-22 08:38:11 -0700
committerJames Tucker <jftucker@gmail.com>2013-04-22 08:38:11 -0700
commit7bda8d485b38403bf07f43793d37b66b7a8281d6 (patch)
treecfc9886fa3a8ecef958b6f99f2a44f6ad70a3e52
parentba98d5f6697cd12122961aa49d84360ccaa446fc (diff)
downloadrack-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.rb17
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