aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack
diff options
context:
space:
mode:
authorAaron Patterson <aaron.patterson@gmail.com>2012-10-25 11:34:37 -0700
committerAaron Patterson <aaron.patterson@gmail.com>2012-10-25 11:34:37 -0700
commitcde326bcefa7e842d5f8090d24b700399ac3d705 (patch)
tree2c8a95e838513012aa06803cc02e835258524fab /actionpack
parentfacd3e87104b0b9bc1142471b76d7b0c80d7062e (diff)
downloadrails-cde326bcefa7e842d5f8090d24b700399ac3d705.tar.gz
rails-cde326bcefa7e842d5f8090d24b700399ac3d705.tar.bz2
rails-cde326bcefa7e842d5f8090d24b700399ac3d705.zip
give access to the original exception raised in case of a parse error
Diffstat (limited to 'actionpack')
-rw-r--r--actionpack/lib/action_controller/metal/exceptions.rb7
-rw-r--r--actionpack/lib/action_dispatch/http/request.rb4
-rw-r--r--actionpack/test/dispatch/request_test.rb14
3 files changed, 23 insertions, 2 deletions
diff --git a/actionpack/lib/action_controller/metal/exceptions.rb b/actionpack/lib/action_controller/metal/exceptions.rb
index 3c9d0c86a7..cf21d26752 100644
--- a/actionpack/lib/action_controller/metal/exceptions.rb
+++ b/actionpack/lib/action_controller/metal/exceptions.rb
@@ -3,6 +3,13 @@ module ActionController
end
class BadRequest < ActionControllerError #:nodoc:
+ attr_reader :original_exception
+
+ def initialize(type, e)
+ super("Invalid #{type} parameters: #{e.message}")
+ @original_exception = e
+ set_backtrace e.backtrace
+ end
end
class RenderError < ActionControllerError #:nodoc:
diff --git a/actionpack/lib/action_dispatch/http/request.rb b/actionpack/lib/action_dispatch/http/request.rb
index 18cf5b2bb0..3de927abc8 100644
--- a/actionpack/lib/action_dispatch/http/request.rb
+++ b/actionpack/lib/action_dispatch/http/request.rb
@@ -253,7 +253,7 @@ module ActionDispatch
def GET
@env["action_dispatch.request.query_parameters"] ||= (normalize_parameters(super) || {})
rescue TypeError => e
- raise ActionController::BadRequest, "Invalid query parameters: #{e.message}", e.backtrace
+ raise ActionController::BadRequest.new(:query, e)
end
alias :query_parameters :GET
@@ -261,7 +261,7 @@ module ActionDispatch
def POST
@env["action_dispatch.request.request_parameters"] ||= (normalize_parameters(super) || {})
rescue TypeError => e
- raise ActionController::BadRequest, "Invalid request parameters: #{e.message}", e.backtrace
+ raise ActionController::BadRequest.new(:request, e)
end
alias :request_parameters :POST
diff --git a/actionpack/test/dispatch/request_test.rb b/actionpack/test/dispatch/request_test.rb
index 26db91c741..e2964f9071 100644
--- a/actionpack/test/dispatch/request_test.rb
+++ b/actionpack/test/dispatch/request_test.rb
@@ -560,6 +560,20 @@ class RequestTest < ActiveSupport::TestCase
assert_equal({}, request.parameters)
end
+ test "we have access to the original exception" do
+ mock_rack_env = { "QUERY_STRING" => "x[y]=1&x[y][][w]=2", "rack.input" => "foo" }
+ request = nil
+ request = stub_request(mock_rack_env)
+
+ e = assert_raises(ActionController::BadRequest) do
+ # rack will raise a TypeError when parsing this query string
+ request.parameters
+ end
+
+ assert e.original_exception
+ assert_equal e.original_exception.backtrace, e.backtrace
+ end
+
test "formats with accept header" do
request = stub_request 'HTTP_ACCEPT' => 'text/html'
request.expects(:parameters).at_least_once.returns({})