提交 a3c6ad7d 编写于 作者: C Carlhuda

Fix a bunch of pending tests by providing an introspection mode for the...

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
上级 bf8898b4
......@@ -37,8 +37,21 @@ def fresh?(response)
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 @@ def etag?
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 @@ def string_body?
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
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?
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 @@ def to_a
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 @@ def process(method, path, parameters = nil, rack_environment = nil)
@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 @@ def test_headers_after_send_shouldnt_include_charset
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 @@ def test_send_file_headers!
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']
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册