mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Finish making things pass with updated internal content_type semantics
This commit is contained in:
parent
c50b03b754
commit
5a8a550a45
7 changed files with 26 additions and 59 deletions
|
@ -125,7 +125,7 @@ module ActionController #:nodoc:
|
|||
end
|
||||
|
||||
@controller.template.formats = [mime_type.to_sym]
|
||||
@response.content_type = mime_type.to_s
|
||||
@response.content_type = mime_type
|
||||
|
||||
block_given? ? block.call : @controller.send(:render, :action => @controller.action_name)
|
||||
end
|
||||
|
|
|
@ -162,15 +162,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)
|
||||
raise ArgumentError, "Unknown MIME type #{options[:type]}" unless Mime::EXTENSION_LOOKUP.key?(content_type.to_s)
|
||||
self.content_type = Mime::Type.lookup_by_extension(content_type.to_s)
|
||||
else
|
||||
self.content_type = content_type
|
||||
end
|
||||
content_type = content_type.to_s.strip # fixes a problem with extra '\r' with some browsers
|
||||
|
||||
headers.merge!(
|
||||
'Content-Length' => options[:length],
|
||||
'Content-Type' => content_type,
|
||||
'Content-Disposition' => disposition,
|
||||
'Content-Transfer-Encoding' => 'binary'
|
||||
)
|
||||
|
|
|
@ -3,7 +3,7 @@ module ActionController
|
|||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
delegate :headers, :status=, :location=,
|
||||
delegate :headers, :status=, :location=, :content_type=,
|
||||
:status, :location, :content_type, :to => "@_response"
|
||||
attr_internal :request, :response
|
||||
end
|
||||
|
|
|
@ -56,6 +56,8 @@ module ActionController #:nodoc:
|
|||
@block = nil
|
||||
@length = 0
|
||||
@body = []
|
||||
@charset = nil
|
||||
@content_type = nil
|
||||
|
||||
@request = @template = nil
|
||||
end
|
||||
|
|
|
@ -67,12 +67,7 @@ module ActionDispatch # :nodoc:
|
|||
end
|
||||
|
||||
def body=(body)
|
||||
@body =
|
||||
if body.respond_to?(:to_str)
|
||||
[body]
|
||||
else
|
||||
body
|
||||
end
|
||||
@body = body.respond_to?(:to_str) ? [body] : body
|
||||
end
|
||||
|
||||
def body_parts
|
||||
|
@ -96,36 +91,7 @@ module ActionDispatch # :nodoc:
|
|||
# If a character set has been defined for this response (see charset=) then
|
||||
# the character set information will also be included in the content type
|
||||
# information.
|
||||
def content_type=(mime_type)
|
||||
self.headers["Content-Type"] =
|
||||
if mime_type =~ /charset/ || (c = charset).nil?
|
||||
mime_type.to_s
|
||||
else
|
||||
"#{mime_type}; charset=#{c}"
|
||||
end
|
||||
end
|
||||
|
||||
# Returns the response's content MIME type, or nil if content type has been set.
|
||||
def content_type
|
||||
content_type = String(headers["Content-Type"] || headers["type"]).split(";")[0]
|
||||
content_type.blank? ? nil : content_type
|
||||
end
|
||||
|
||||
# Set the charset of the Content-Type header. Set to nil to remove it.
|
||||
# If no content type is set, it defaults to HTML.
|
||||
def charset=(charset)
|
||||
headers["Content-Type"] =
|
||||
if charset
|
||||
"#{content_type || Mime::HTML}; charset=#{charset}"
|
||||
else
|
||||
content_type || Mime::HTML.to_s
|
||||
end
|
||||
end
|
||||
|
||||
def charset
|
||||
charset = String(headers["Content-Type"] || headers["type"]).split(";")[1]
|
||||
charset.blank? ? nil : charset.strip.split("=")[1]
|
||||
end
|
||||
attr_accessor :charset, :content_type
|
||||
|
||||
def last_modified
|
||||
if last = headers['Last-Modified']
|
||||
|
@ -162,15 +128,15 @@ module ActionDispatch # :nodoc:
|
|||
end
|
||||
|
||||
def assign_default_content_type_and_charset!
|
||||
if type = headers['Content-Type'] || headers['type']
|
||||
unless type =~ /charset=/ || sending_file?
|
||||
headers['Content-Type'] = "#{type}; charset=#{default_charset}"
|
||||
end
|
||||
else
|
||||
type = Mime::HTML.to_s
|
||||
type += "; charset=#{default_charset}" unless sending_file?
|
||||
headers['Content-Type'] = type
|
||||
end
|
||||
return if !headers["Content-Type"].blank?
|
||||
|
||||
@content_type ||= Mime::HTML
|
||||
@charset ||= default_charset
|
||||
|
||||
type = @content_type.to_s.dup
|
||||
type << "; charset=#{@charset}" unless sending_file?
|
||||
|
||||
headers["Content-Type"] = type
|
||||
end
|
||||
|
||||
def prepare!
|
||||
|
|
|
@ -83,14 +83,14 @@ class ContentTypeTest < ActionController::TestCase
|
|||
# :ported:
|
||||
def test_content_type_from_body
|
||||
get :render_content_type_from_body
|
||||
assert_equal "application/rss+xml", @response.content_type
|
||||
assert_equal Mime::RSS, @response.content_type
|
||||
assert_equal "utf-8", @response.charset
|
||||
end
|
||||
|
||||
# :ported:
|
||||
def test_content_type_from_render
|
||||
get :render_content_type_from_render
|
||||
assert_equal "application/rss+xml", @response.content_type
|
||||
assert_equal Mime::RSS, @response.content_type
|
||||
assert_equal "utf-8", @response.charset
|
||||
end
|
||||
|
||||
|
|
|
@ -91,10 +91,10 @@ class SendFileTest < ActionController::TestCase
|
|||
|
||||
def test_headers_after_send_shouldnt_include_charset
|
||||
response = process('data')
|
||||
assert_equal "application/octet-stream", response.content_type
|
||||
assert_equal "application/octet-stream", response.headers["Content-Type"]
|
||||
|
||||
response = process('file')
|
||||
assert_equal "application/octet-stream", response.content_type
|
||||
assert_equal "application/octet-stream", response.headers["Content-Type"]
|
||||
end
|
||||
|
||||
# Test that send_file_headers! is setting the correct HTTP headers.
|
||||
|
@ -116,7 +116,7 @@ class SendFileTest < ActionController::TestCase
|
|||
|
||||
h = @controller.headers
|
||||
assert_equal 1, h['Content-Length']
|
||||
assert_equal 'image/png', h['Content-Type']
|
||||
assert_equal 'image/png', @controller.content_type
|
||||
assert_equal 'disposition; filename="filename"', h['Content-Disposition']
|
||||
assert_equal 'binary', h['Content-Transfer-Encoding']
|
||||
|
||||
|
@ -136,9 +136,7 @@ class SendFileTest < ActionController::TestCase
|
|||
@controller.headers = {}
|
||||
@controller.send(:send_file_headers!, options)
|
||||
|
||||
headers = @controller.headers
|
||||
|
||||
assert_equal 'image/png', headers['Content-Type']
|
||||
assert_equal 'image/png', @controller.content_type
|
||||
end
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue