1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

flushing output should write to the stream rather than mutating the response object

This commit is contained in:
Aaron Patterson 2012-07-29 17:02:00 -07:00
parent 19e68e9d47
commit a6bdae1c19
3 changed files with 16 additions and 12 deletions

View file

@ -42,7 +42,7 @@ module ActionDispatch # :nodoc:
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 @@ module ActionDispatch # :nodoc:
@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 @@ module ActionDispatch # :nodoc:
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 @@ module ActionDispatch # :nodoc:
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 @@ module ActionDispatch # :nodoc:
end
def close
@body.close if @body.respond_to?(:close)
stream.close
end
def to_a

View file

@ -213,7 +213,7 @@ module ActionView
# 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

View file

@ -51,14 +51,14 @@ class SendFileTest < ActionController::TestCase
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