1
0
Fork 0
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:
Carlhuda 2010-02-19 19:19:20 -08:00
parent bf8898b49b
commit a3c6ad7d5e
4 changed files with 42 additions and 21 deletions

View file

@ -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]

View file

@ -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

View file

@ -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']

View file

@ -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']