Skip to content

Commit cde326b

Browse files
committed
give access to the original exception raised in case of a parse error
1 parent facd3e8 commit cde326b

File tree

3 files changed

+23
-2
lines changed

3 files changed

+23
-2
lines changed

actionpack/lib/action_controller/metal/exceptions.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,13 @@ class ActionControllerError < StandardError #:nodoc:
33
end
44

55
class BadRequest < ActionControllerError #:nodoc:
6+
attr_reader :original_exception
7+
8+
def initialize(type, e)
9+
super("Invalid #{type} parameters: #{e.message}")
10+
@original_exception = e
11+
set_backtrace e.backtrace
12+
end
613
end
714

815
class RenderError < ActionControllerError #:nodoc:

actionpack/lib/action_dispatch/http/request.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -253,15 +253,15 @@ def session_options=(options)
253253
def GET
254254
@env["action_dispatch.request.query_parameters"] ||= (normalize_parameters(super) || {})
255255
rescue TypeError => e
256-
raise ActionController::BadRequest, "Invalid query parameters: #{e.message}", e.backtrace
256+
raise ActionController::BadRequest.new(:query, e)
257257
end
258258
alias :query_parameters :GET
259259

260260
# Override Rack's POST method to support indifferent access
261261
def POST
262262
@env["action_dispatch.request.request_parameters"] ||= (normalize_parameters(super) || {})
263263
rescue TypeError => e
264-
raise ActionController::BadRequest, "Invalid request parameters: #{e.message}", e.backtrace
264+
raise ActionController::BadRequest.new(:request, e)
265265
end
266266
alias :request_parameters :POST
267267

actionpack/test/dispatch/request_test.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -560,6 +560,20 @@ def url_for(options = {})
560560
assert_equal({}, request.parameters)
561561
end
562562

563+
test "we have access to the original exception" do
564+
mock_rack_env = { "QUERY_STRING" => "x[y]=1&x[y][][w]=2", "rack.input" => "foo" }
565+
request = nil
566+
request = stub_request(mock_rack_env)
567+
568+
e = assert_raises(ActionController::BadRequest) do
569+
# rack will raise a TypeError when parsing this query string
570+
request.parameters
571+
end
572+
573+
assert e.original_exception
574+
assert_equal e.original_exception.backtrace, e.backtrace
575+
end
576+
563577
test "formats with accept header" do
564578
request = stub_request 'HTTP_ACCEPT' => 'text/html'
565579
request.expects(:parameters).at_least_once.returns({})

0 commit comments

Comments
 (0)