Skip to content

Commit 3eff729

Browse files
Miles Eganjosevalim
authored andcommitted
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>
1 parent 933f745 commit 3eff729

File tree

2 files changed

+14
-2
lines changed

2 files changed

+14
-2
lines changed

actionpack/lib/action_dispatch/http/request.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -214,13 +214,13 @@ def session_options=(options)
214214

215215
# Override Rack's GET method to support indifferent access
216216
def GET
217-
@env["action_dispatch.request.query_parameters"] ||= normalize_parameters(super)
217+
@env["action_dispatch.request.query_parameters"] ||= (normalize_parameters(super) || {})
218218
end
219219
alias :query_parameters :GET
220220

221221
# Override Rack's POST method to support indifferent access
222222
def POST
223-
@env["action_dispatch.request.request_parameters"] ||= normalize_parameters(super)
223+
@env["action_dispatch.request.request_parameters"] ||= (normalize_parameters(super) || {})
224224
end
225225
alias :request_parameters :POST
226226

actionpack/test/dispatch/request_test.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,18 @@ class RequestTest < ActiveSupport::TestCase
385385
assert_equal({"bar" => 2}, request.query_parameters)
386386
end
387387

388+
test "parameters still accessible after rack parse error" do
389+
mock_rack_env = { "QUERY_STRING" => "x[y]=1&x[y][][w]=2", "rack.input" => "foo" }
390+
request = nil
391+
begin
392+
request = stub_request(mock_rack_env)
393+
request.parameters
394+
rescue TypeError => e
395+
# rack will raise a TypeError when parsing this query string
396+
end
397+
assert_equal({}, request.parameters)
398+
end
399+
388400
test "formats with accept header" do
389401
request = stub_request 'HTTP_ACCEPT' => 'text/html'
390402
request.expects(:parameters).at_least_once.returns({})

0 commit comments

Comments
 (0)