make sure request parameters are accessible after rack throws an exception parsing the query string [#3030 state:resolved]

Signed-off-by: José Valim <jose.valim@gmail.com>
This commit is contained in:
Miles Egan 2010-07-18 09:10:20 -07:00 committed by José Valim
parent 933f745dcb
commit 3eff729079
2 changed files with 14 additions and 2 deletions

View File

@ -214,13 +214,13 @@ module ActionDispatch
# Override Rack's GET method to support indifferent access # Override Rack's GET method to support indifferent access
def GET def GET
@env["action_dispatch.request.query_parameters"] ||= normalize_parameters(super) @env["action_dispatch.request.query_parameters"] ||= (normalize_parameters(super) || {})
end end
alias :query_parameters :GET alias :query_parameters :GET
# Override Rack's POST method to support indifferent access # Override Rack's POST method to support indifferent access
def POST def POST
@env["action_dispatch.request.request_parameters"] ||= normalize_parameters(super) @env["action_dispatch.request.request_parameters"] ||= (normalize_parameters(super) || {})
end end
alias :request_parameters :POST alias :request_parameters :POST

View File

@ -385,6 +385,18 @@ class RequestTest < ActiveSupport::TestCase
assert_equal({"bar" => 2}, request.query_parameters) assert_equal({"bar" => 2}, request.query_parameters)
end end
test "parameters still accessible after rack parse error" do
mock_rack_env = { "QUERY_STRING" => "x[y]=1&x[y][][w]=2", "rack.input" => "foo" }
request = nil
begin
request = stub_request(mock_rack_env)
request.parameters
rescue TypeError => e
# rack will raise a TypeError when parsing this query string
end
assert_equal({}, request.parameters)
end
test "formats with accept header" do test "formats with accept header" do
request = stub_request 'HTTP_ACCEPT' => 'text/html' request = stub_request 'HTTP_ACCEPT' => 'text/html'
request.expects(:parameters).at_least_once.returns({}) request.expects(:parameters).at_least_once.returns({})