Permalink
Browse files

flushing output should write to the stream rather than mutating the r…

…esponse object
  • Loading branch information...
1 parent 19e68e9 commit a6bdae1c19f1a6ace1f6504b2716c8e8eae0d64f @tenderlove tenderlove committed Jul 30, 2012
@@ -42,7 +42,7 @@ class Response
alias_method :headers, :header
delegate :[], :[]=, :to => :@header
- delegate :each, :to => :@body
+ delegate :each, :to => :@stream
# Sets the HTTP response's content MIME type. For example, in the controller
# you could write this:
@@ -106,8 +106,6 @@ def initialize(status = 200, header = {}, body = [])
@committed = false
@content_type = nil
@charset = nil
- @stream = build_buffer self, @body
-
if content_type = self[CONTENT_TYPE]
type, charset = content_type.split(/;\s*charset=/)
@@ -162,14 +160,14 @@ def message
def respond_to?(method)
if method.to_sym == :to_path
- @body.respond_to?(:to_path)
+ stream.respond_to?(:to_path)
else
super
end
end
def to_path
- @body.to_path
+ stream.to_path
end
def body
@@ -183,11 +181,17 @@ def body
def body=(body)
@blank = true if body == EMPTY
- @body = munge_body_object(body)
+ if body.respond_to?(:to_path)
+ @stream = body
+ else
+ @stream = build_buffer self, munge_body_object(body)
+ end
end
def body_parts
- @body
+ parts = []
+ @stream.each { |x| parts << x }
+ parts
end
def set_cookie(key, value)
@@ -208,7 +212,7 @@ def location=(url)
end
def close
- @body.close if @body.respond_to?(:close)
+ stream.close
end
def to_a
@@ -213,7 +213,7 @@ def with_output_buffer(buf = nil) #:nodoc:
# Add the output buffer to the response body and start a new one.
def flush_output_buffer #:nodoc:
if output_buffer && !output_buffer.empty?
- response.body_parts << output_buffer
+ response.stream.write output_buffer
self.output_buffer = output_buffer.respond_to?(:clone_empty) ? output_buffer.clone_empty : output_buffer[0, 0]
nil
end
@@ -51,14 +51,14 @@ def test_file_stream
response = nil
assert_nothing_raised { response = process('file') }
assert_not_nil response
- assert_respond_to response.body_parts, :each
- assert_respond_to response.body_parts, :to_path
+ assert_respond_to response.stream, :each
+ assert_respond_to response.stream, :to_path
require 'stringio'
output = StringIO.new
output.binmode
output.string.force_encoding(file_data.encoding)
- assert_nothing_raised { response.body_parts.each { |part| output << part.to_s } }
+ response.body_parts.each { |part| output << part.to_s }
assert_equal file_data, output.string
end

0 comments on commit a6bdae1

Please sign in to comment.