lib/rack/chunked.rb in rack-1.2.8 vs lib/rack/chunked.rb in rack-1.3.0.beta
- old
+ new
@@ -5,10 +5,36 @@
# Middleware that applies chunked transfer encoding to response bodies
# when the response does not include a Content-Length header.
class Chunked
include Rack::Utils
+ # A body wrapper that emits chunked responses
+ class Body
+ TERM = "\r\n"
+ TAIL = "0#{TERM}#{TERM}"
+
+ include Rack::Utils
+
+ def initialize(body)
+ @body = body
+ end
+
+ def each
+ term = TERM
+ @body.each do |chunk|
+ size = bytesize(chunk)
+ next if size == 0
+ yield [size.to_s(16), term, chunk, term].join
+ end
+ yield TAIL
+ end
+
+ def close
+ @body.close if @body.respond_to?(:close)
+ end
+ end
+
def initialize(app)
@app = app
end
def call(env)
@@ -19,31 +45,12 @@
STATUS_WITH_NO_ENTITY_BODY.include?(status) ||
headers['Content-Length'] ||
headers['Transfer-Encoding']
[status, headers, body]
else
- dup.chunk(status, headers, body)
+ headers.delete('Content-Length')
+ headers['Transfer-Encoding'] = 'chunked'
+ [status, headers, Body.new(body)]
end
- end
-
- def chunk(status, headers, body)
- @body = body
- headers.delete('Content-Length')
- headers['Transfer-Encoding'] = 'chunked'
- [status, headers, self]
- end
-
- def each
- term = "\r\n"
- @body.each do |chunk|
- size = bytesize(chunk)
- next if size == 0
- yield [size.to_s(16), term, chunk, term].join
- end
- yield ["0", term, "", term].join
- end
-
- def close
- @body.close if @body.respond_to?(:close)
end
end
end