mirror of
https://github.com/github/rails.git
synced 2026-04-26 03:00:59 -04:00
Allow use of symbols for :type option of ActionController::Streaming#send_file/#send_data [#1232 state:resolved]
Signed-off-by: Frederick Cheung <frederick.cheung@gmail.com>
This commit is contained in:
committed by
Frederick Cheung
parent
7cda0df7f1
commit
fcd58dc27a
@@ -24,7 +24,8 @@ module ActionController #:nodoc:
|
||||
# Options:
|
||||
# * <tt>:filename</tt> - suggests a filename for the browser to use.
|
||||
# Defaults to <tt>File.basename(path)</tt>.
|
||||
# * <tt>:type</tt> - specifies an HTTP content type. Defaults to 'application/octet-stream'.
|
||||
# * <tt>:type</tt> - specifies an HTTP content type. Defaults to 'application/octet-stream'. You can specify
|
||||
# either a string or a symbol for a registered type register with <tt>Mime::Type.register</tt>, for example :json
|
||||
# * <tt>:length</tt> - used to manually override the length (in bytes) of the content that
|
||||
# is going to be sent to the client. Defaults to <tt>File.size(path)</tt>.
|
||||
# * <tt>:disposition</tt> - specifies whether the file will be shown inline or downloaded.
|
||||
@@ -107,7 +108,8 @@ module ActionController #:nodoc:
|
||||
#
|
||||
# Options:
|
||||
# * <tt>:filename</tt> - suggests a filename for the browser to use.
|
||||
# * <tt>:type</tt> - specifies an HTTP content type. Defaults to 'application/octet-stream'.
|
||||
# * <tt>:type</tt> - specifies an HTTP content type. Defaults to 'application/octet-stream'. You can specify
|
||||
# either a string or a symbol for a registered type register with <tt>Mime::Type.register</tt>, for example :json
|
||||
# * <tt>:disposition</tt> - specifies whether the file will be shown inline or downloaded.
|
||||
# Valid values are 'inline' and 'attachment' (default).
|
||||
# * <tt>:status</tt> - specifies the status code to send with the response. Defaults to '200 OK'.
|
||||
@@ -143,9 +145,16 @@ module ActionController #:nodoc:
|
||||
|
||||
disposition <<= %(; filename="#{options[:filename]}") if options[:filename]
|
||||
|
||||
content_type = options[:type]
|
||||
if content_type.is_a?(Symbol)
|
||||
raise ArgumentError, "Unknown MIME type #{options[:type]}" unless Mime::EXTENSION_LOOKUP.has_key?(content_type.to_s)
|
||||
content_type = Mime::Type.lookup_by_extension(content_type.to_s)
|
||||
end
|
||||
content_type = content_type.to_s.strip # fixes a problem with extra '\r' with some browsers
|
||||
|
||||
headers.update(
|
||||
'Content-Length' => options[:length],
|
||||
'Content-Type' => options[:type].to_s.strip, # fixes a problem with extra '\r' with some browsers
|
||||
'Content-Type' => content_type,
|
||||
'Content-Disposition' => disposition,
|
||||
'Content-Transfer-Encoding' => 'binary'
|
||||
)
|
||||
|
||||
@@ -119,6 +119,31 @@ class SendFileTest < Test::Unit::TestCase
|
||||
assert_equal 'private', h['Cache-Control']
|
||||
end
|
||||
|
||||
def test_send_file_headers_with_mime_lookup_with_symbol
|
||||
options = {
|
||||
:length => 1,
|
||||
:type => :png
|
||||
}
|
||||
|
||||
@controller.headers = {}
|
||||
@controller.send(:send_file_headers!, options)
|
||||
|
||||
headers = @controller.headers
|
||||
|
||||
assert_equal 'image/png', headers['Content-Type']
|
||||
end
|
||||
|
||||
|
||||
def test_send_file_headers_with_bad_symbol
|
||||
options = {
|
||||
:length => 1,
|
||||
:type => :this_type_is_not_registered
|
||||
}
|
||||
|
||||
@controller.headers = {}
|
||||
assert_raises(ArgumentError){ @controller.send(:send_file_headers!, options) }
|
||||
end
|
||||
|
||||
%w(file data).each do |method|
|
||||
define_method "test_send_#{method}_status" do
|
||||
@controller.options = { :stream => false, :status => 500 }
|
||||
|
||||
Reference in New Issue
Block a user