mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Fix streaming by having it create a File object, which can be handled by Rack servers as appropriate
This commit is contained in:
parent
ee541049fd
commit
3345af61fb
5 changed files with 22 additions and 18 deletions
|
@ -79,6 +79,8 @@ module ActionController #:nodoc:
|
|||
# http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9
|
||||
# for the Cache-Control header spec.
|
||||
def send_file(path, options = {}) #:doc:
|
||||
# self.response_body = File.open(path)
|
||||
|
||||
raise MissingFile, "Cannot read file #{path}" unless File.file?(path) and File.readable?(path)
|
||||
|
||||
options[:length] ||= File.size(path)
|
||||
|
@ -90,19 +92,9 @@ module ActionController #:nodoc:
|
|||
if options[:x_sendfile]
|
||||
head options[:status], X_SENDFILE_HEADER => path
|
||||
else
|
||||
if options[:stream]
|
||||
# TODO : Make render :text => proc {} work with the new base
|
||||
render :status => options[:status], :text => Proc.new { |response, output|
|
||||
len = options[:buffer_size] || 4096
|
||||
File.open(path, 'rb') do |file|
|
||||
while buf = file.read(len)
|
||||
output.write(buf)
|
||||
end
|
||||
end
|
||||
}
|
||||
else
|
||||
File.open(path, 'rb') { |file| render :status => options[:status], :text => file.read }
|
||||
end
|
||||
self.status = options[:status] || 200
|
||||
self.content_type = options[:content_type] if options.key?(:content_type)
|
||||
self.response_body = File.open(path, "rb")
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -139,7 +131,7 @@ module ActionController #:nodoc:
|
|||
# instead. See ActionController::Base#render for more information.
|
||||
def send_data(data, options = {}) #:doc:
|
||||
send_file_headers! options.merge(:length => data.bytesize)
|
||||
render :status => options[:status], :text => data
|
||||
render options.slice(:status, :content_type).merge(:text => data)
|
||||
end
|
||||
|
||||
private
|
||||
|
|
|
@ -13,7 +13,6 @@ module ActionController
|
|||
if cookies = @_request.env['action_dispatch.cookies']
|
||||
cookies.write(@_response)
|
||||
end
|
||||
@_response.body ||= self.response_body
|
||||
@_response.prepare!
|
||||
set_test_assigns
|
||||
ret
|
||||
|
|
|
@ -46,15 +46,17 @@ class SendFileTest < ActionController::TestCase
|
|||
response = nil
|
||||
assert_nothing_raised { response = process('file') }
|
||||
assert_not_nil response
|
||||
assert_kind_of String, response.body
|
||||
assert_equal file_data, response.body
|
||||
body = response.body
|
||||
assert_kind_of String, body
|
||||
assert_equal file_data, body
|
||||
end
|
||||
|
||||
def test_file_stream
|
||||
response = nil
|
||||
assert_nothing_raised { response = process('file') }
|
||||
assert_not_nil response
|
||||
assert_kind_of Array, response.body_parts
|
||||
assert response.body_parts.respond_to?(:each)
|
||||
assert response.body_parts.respond_to?(:to_path)
|
||||
|
||||
require 'stringio'
|
||||
output = StringIO.new
|
||||
|
@ -160,6 +162,12 @@ class SendFileTest < ActionController::TestCase
|
|||
assert_equal 500, @response.status
|
||||
end
|
||||
|
||||
define_method "test_send_#{method}_content_type" do
|
||||
@controller.options = { :stream => false, :content_type => "application/x-ruby" }
|
||||
assert_nothing_raised { assert_not_nil process(method) }
|
||||
assert_equal "application/x-ruby", @response.content_type
|
||||
end
|
||||
|
||||
define_method "test_default_send_#{method}_status" do
|
||||
@controller.options = { :stream => false }
|
||||
assert_nothing_raised { assert_not_nil process(method) }
|
||||
|
|
|
@ -17,3 +17,4 @@ require 'active_support/core_ext/string/conversions'
|
|||
require 'active_support/core_ext/string/interpolation'
|
||||
require 'active_support/core_ext/rexml'
|
||||
require 'active_support/core_ext/time/conversions'
|
||||
require 'active_support/core_ext/file/path'
|
||||
|
|
|
@ -57,6 +57,10 @@ class AtomicWriteTest < Test::Unit::TestCase
|
|||
File.unlink(file_name) rescue nil
|
||||
end
|
||||
|
||||
def test_responds_to_to_path
|
||||
assert_equal __FILE__, File.open(__FILE__, "r").to_path
|
||||
end
|
||||
|
||||
private
|
||||
def file_name
|
||||
"atomic.file"
|
||||
|
|
Loading…
Reference in a new issue