mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Fix a bunch of pending tests by providing an introspection mode for the Response object that does up-front parsing of the headers to populate things like @etag
This commit is contained in:
parent
bf8898b49b
commit
a3c6ad7d5e
4 changed files with 42 additions and 21 deletions
|
@ -37,8 +37,21 @@ module ActionDispatch
|
|||
end
|
||||
|
||||
module Response
|
||||
def cache_control
|
||||
@cache_control ||= {}
|
||||
attr_reader :cache_control
|
||||
|
||||
def initialize(*)
|
||||
status, header, body = super
|
||||
|
||||
@cache_control = {}
|
||||
@etag = self["ETag"]
|
||||
|
||||
if cache_control = self["Cache-Control"]
|
||||
cache_control.split(/,\s*/).each do |segment|
|
||||
first, last = segment.split("=")
|
||||
last ||= true
|
||||
@cache_control[first.to_sym] = last
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def last_modified
|
||||
|
@ -65,7 +78,7 @@ module ActionDispatch
|
|||
|
||||
def etag=(etag)
|
||||
key = ActiveSupport::Cache.expand_cache_key(etag)
|
||||
@etag = %("#{Digest::MD5.hexdigest(key)}")
|
||||
@etag = self["ETag"] = %("#{Digest::MD5.hexdigest(key)}")
|
||||
end
|
||||
|
||||
private
|
||||
|
@ -100,6 +113,8 @@ module ActionDispatch
|
|||
def set_conditional_cache_control!
|
||||
control = @cache_control
|
||||
|
||||
return if self["Cache-Control"].present?
|
||||
|
||||
if control.empty?
|
||||
headers["Cache-Control"] = DEFAULT_CACHE_CONTROL
|
||||
elsif @cache_control[:no_cache]
|
||||
|
|
|
@ -32,31 +32,37 @@ module ActionDispatch # :nodoc:
|
|||
# end
|
||||
# end
|
||||
class Response < Rack::Response
|
||||
include ActionDispatch::Http::Cache::Response
|
||||
|
||||
attr_accessor :request, :blank
|
||||
|
||||
attr_writer :header, :sending_file
|
||||
alias_method :headers=, :header=
|
||||
|
||||
def initialize
|
||||
@status = 200
|
||||
@header = {}
|
||||
@cache_control = {}
|
||||
module Setup
|
||||
def initialize(status = 200, header = {}, body = [])
|
||||
@writer = lambda { |x| @body << x }
|
||||
@block = nil
|
||||
@length = 0
|
||||
|
||||
@writer = lambda { |x| @body << x }
|
||||
@block = nil
|
||||
@length = 0
|
||||
@status, @header, @body = status, header, body
|
||||
|
||||
@body, @cookie = [], []
|
||||
@sending_file = false
|
||||
@cookie = []
|
||||
@sending_file = false
|
||||
|
||||
@blank = false
|
||||
@etag = nil
|
||||
@blank = false
|
||||
|
||||
yield self if block_given?
|
||||
if content_type = self["Content-Type"]
|
||||
type, charset = content_type.split(/;\s*charset=/)
|
||||
@content_type = Mime::Type.lookup(type)
|
||||
@charset = charset || "UTF-8"
|
||||
end
|
||||
|
||||
yield self if block_given?
|
||||
end
|
||||
end
|
||||
|
||||
include Setup
|
||||
include ActionDispatch::Http::Cache::Response
|
||||
|
||||
def status=(status)
|
||||
@status = Rack::Utils.status_code(status)
|
||||
end
|
||||
|
@ -120,7 +126,7 @@ module ActionDispatch # :nodoc:
|
|||
assign_default_content_type_and_charset!
|
||||
handle_conditional_get!
|
||||
self["Set-Cookie"] = @cookie.join("\n") unless @cookie.blank?
|
||||
self["ETag"] = @etag if @etag
|
||||
self["ETag"] = @_etag if @_etag
|
||||
super
|
||||
end
|
||||
|
||||
|
|
|
@ -273,7 +273,8 @@ module ActionDispatch
|
|||
|
||||
@request_count += 1
|
||||
@request = ActionDispatch::Request.new(session.last_request.env)
|
||||
@response = ActionDispatch::TestResponse.from_response(@mock_session.last_response)
|
||||
response = @mock_session.last_response
|
||||
@response = ActionDispatch::TestResponse.new(response.status, response.headers, response.body)
|
||||
@html_document = nil
|
||||
|
||||
@controller = session.last_request.env['action_controller.instance']
|
||||
|
|
|
@ -102,7 +102,7 @@ class SendFileTest < ActionController::TestCase
|
|||
end
|
||||
|
||||
# Test that send_file_headers! is setting the correct HTTP headers.
|
||||
def test_send_file_headers!
|
||||
def test_send_file_headers_bang
|
||||
options = {
|
||||
:length => 1,
|
||||
:type => Mime::PNG,
|
||||
|
@ -125,7 +125,6 @@ class SendFileTest < ActionController::TestCase
|
|||
assert_equal 'binary', h['Content-Transfer-Encoding']
|
||||
|
||||
# test overriding Cache-Control: no-cache header to fix IE open/save dialog
|
||||
@controller.headers = { 'Cache-Control' => 'no-cache' }
|
||||
@controller.send(:send_file_headers!, options)
|
||||
@controller.response.prepare!
|
||||
assert_equal 'private', h['Cache-Control']
|
||||
|
|
Loading…
Reference in a new issue