mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Avoid creating a Rack::Response object in the cookie middleware since it may stream the body.
This commit is contained in:
parent
03c3d1eb84
commit
d3e62fc57c
1 changed files with 13 additions and 9 deletions
|
@ -52,12 +52,15 @@ module ActionDispatch
|
|||
# * <tt>:httponly</tt> - Whether this cookie is accessible via scripting or
|
||||
# only HTTP. Defaults to +false+.
|
||||
class Cookies
|
||||
HTTP_HEADER = "Set-Cookie".freeze
|
||||
TOKEN_KEY = "action_dispatch.secret_token".freeze
|
||||
|
||||
# Raised when storing more than 4K of session data.
|
||||
class CookieOverflow < StandardError; end
|
||||
|
||||
class CookieJar < Hash #:nodoc:
|
||||
def self.build(request)
|
||||
secret = request.env["action_dispatch.secret_token"]
|
||||
secret = request.env[TOKEN_KEY]
|
||||
new(secret).tap do |hash|
|
||||
hash.update(request.cookies)
|
||||
end
|
||||
|
@ -137,9 +140,9 @@ module ActionDispatch
|
|||
@signed ||= SignedCookieJar.new(self, @secret)
|
||||
end
|
||||
|
||||
def write(response)
|
||||
@set_cookies.each { |k, v| response.set_cookie(k, v) }
|
||||
@delete_cookies.each { |k, v| response.delete_cookie(k, v) }
|
||||
def write(headers)
|
||||
@set_cookies.each { |k, v| ::Rack::Utils.set_cookie_header!(headers, k, v) }
|
||||
@delete_cookies.each { |k, v| ::Rack::Utils.delete_cookie_header!(headers, k, v) }
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -232,12 +235,13 @@ module ActionDispatch
|
|||
status, headers, body = @app.call(env)
|
||||
|
||||
if cookie_jar = env['action_dispatch.cookies']
|
||||
response = Rack::Response.new(body, status, headers)
|
||||
cookie_jar.write(response)
|
||||
response.to_a
|
||||
else
|
||||
[status, headers, body]
|
||||
cookie_jar.write(headers)
|
||||
if headers[HTTP_HEADER].respond_to?(:join)
|
||||
headers[HTTP_HEADER] = headers[HTTP_HEADER].join("\n")
|
||||
end
|
||||
end
|
||||
|
||||
[status, headers, body]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue