aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCarlhuda <carlhuda@engineyard.com>2010-02-23 15:37:17 -0800
committerCarlhuda <carlhuda@engineyard.com>2010-02-23 15:37:17 -0800
commit3345af61fb128d0a70793b235e3cb878781d6f40 (patch)
tree13f658ed836dc7d8c15eb9486cef39f340496722
parentee541049fdbe5eeebcca2f3b83144a5d803345a9 (diff)
downloadrails-3345af61fb128d0a70793b235e3cb878781d6f40.tar.gz
rails-3345af61fb128d0a70793b235e3cb878781d6f40.tar.bz2
rails-3345af61fb128d0a70793b235e3cb878781d6f40.zip
Fix streaming by having it create a File object, which can be handled by Rack servers as appropriate
-rw-r--r--actionpack/lib/action_controller/metal/streaming.rb20
-rw-r--r--actionpack/lib/action_controller/metal/testing.rb1
-rw-r--r--actionpack/test/controller/send_file_test.rb14
-rw-r--r--activesupport/lib/active_support/ruby/shim.rb1
-rw-r--r--activesupport/test/core_ext/file_test.rb4
5 files changed, 22 insertions, 18 deletions
diff --git a/actionpack/lib/action_controller/metal/streaming.rb b/actionpack/lib/action_controller/metal/streaming.rb
index 8f03b8bb17..0d6fdafe0a 100644
--- a/actionpack/lib/action_controller/metal/streaming.rb
+++ b/actionpack/lib/action_controller/metal/streaming.rb
@@ -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
diff --git a/actionpack/lib/action_controller/metal/testing.rb b/actionpack/lib/action_controller/metal/testing.rb
index 707ad968f4..4b8c452d50 100644
--- a/actionpack/lib/action_controller/metal/testing.rb
+++ b/actionpack/lib/action_controller/metal/testing.rb
@@ -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
diff --git a/actionpack/test/controller/send_file_test.rb b/actionpack/test/controller/send_file_test.rb
index 31177223e4..ce144cc24b 100644
--- a/actionpack/test/controller/send_file_test.rb
+++ b/actionpack/test/controller/send_file_test.rb
@@ -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) }
diff --git a/activesupport/lib/active_support/ruby/shim.rb b/activesupport/lib/active_support/ruby/shim.rb
index 1e49ccdade..f0db5b3021 100644
--- a/activesupport/lib/active_support/ruby/shim.rb
+++ b/activesupport/lib/active_support/ruby/shim.rb
@@ -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'
diff --git a/activesupport/test/core_ext/file_test.rb b/activesupport/test/core_ext/file_test.rb
index 26be694176..e1258b872e 100644
--- a/activesupport/test/core_ext/file_test.rb
+++ b/activesupport/test/core_ext/file_test.rb
@@ -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"