aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib
diff options
context:
space:
mode:
authorAaron Patterson <aaron.patterson@gmail.com>2015-09-18 11:19:04 -0700
committerAaron Patterson <aaron.patterson@gmail.com>2015-09-18 11:19:04 -0700
commit3efb0bcdafc524cbbb002455b9bbc1233e43a868 (patch)
tree33d0d9af1acd60f78ee1b3a4790b904461f1a6b6 /actionpack/lib
parent76c7162c1d63dc8a7a324913f0a7ba9d3f9165ec (diff)
downloadrails-3efb0bcdafc524cbbb002455b9bbc1233e43a868.tar.gz
rails-3efb0bcdafc524cbbb002455b9bbc1233e43a868.tar.bz2
rails-3efb0bcdafc524cbbb002455b9bbc1233e43a868.zip
move parameter parsing to the request object
All parameter parsing should be on the request object because the request object is the object that we ask for parameters.
Diffstat (limited to 'actionpack/lib')
-rw-r--r--actionpack/lib/action_dispatch/http/request.rb35
-rw-r--r--actionpack/lib/action_dispatch/middleware/params_parser.rb24
2 files changed, 37 insertions, 22 deletions
diff --git a/actionpack/lib/action_dispatch/http/request.rb b/actionpack/lib/action_dispatch/http/request.rb
index b2566c4820..68a8ca707a 100644
--- a/actionpack/lib/action_dispatch/http/request.rb
+++ b/actionpack/lib/action_dispatch/http/request.rb
@@ -348,13 +348,29 @@ module ActionDispatch
# Override Rack's POST method to support indifferent access
def POST
fetch_header("action_dispatch.request.request_parameters") do
- self.request_parameters = Request::Utils.normalize_encode_params(super || {})
+ default = ->() {
+ Request::Utils.normalize_encode_params(super || {})
+ }
+ pr = parse_formatted_parameters(self, params_parsers, default) do |params|
+ params
+ end
+ self.request_parameters = pr
end
rescue Rack::Utils::ParameterTypeError, Rack::Utils::InvalidParameterError => e
raise ActionController::BadRequest.new(:request, e)
end
alias :request_parameters :POST
+ def params_parsers
+ fetch_header "action_dispatch.request.params_parsers" do
+ {}
+ end
+ end
+
+ def params_parsers= hash
+ set_header "action_dispatch.request.params_parsers", hash
+ end
+
# Returns the authorization header regardless of whether it was specified directly or through one of the
# proxy alternatives.
def authorization
@@ -383,5 +399,22 @@ module ActionDispatch
HTTP_METHOD_LOOKUP[name] || raise(ActionController::UnknownHttpMethod, "#{name}, accepted HTTP methods are #{HTTP_METHODS[0...-1].join(', ')}, and #{HTTP_METHODS[-1]}")
name
end
+
+ def parse_formatted_parameters(request, parsers, default = ->() { nil })
+ return default.call if request.content_length.zero?
+
+ strategy = parsers.fetch(request.content_mime_type) { return default.call }
+
+ yield strategy.call(request.raw_post)
+
+ rescue Rack::QueryParser::InvalidParameterError
+ raise
+ rescue => e # JSON or Ruby code block errors
+ my_logger = logger || ActiveSupport::Logger.new($stderr)
+ my_logger.debug "Error occurred while parsing request parameters.\nContents:\n\n#{request.raw_post}"
+ request.request_parameters = {}
+
+ raise ParamsParser::ParseError.new(e.message, e)
+ end
end
end
diff --git a/actionpack/lib/action_dispatch/middleware/params_parser.rb b/actionpack/lib/action_dispatch/middleware/params_parser.rb
index 9cde9c9b98..a658a414a5 100644
--- a/actionpack/lib/action_dispatch/middleware/params_parser.rb
+++ b/actionpack/lib/action_dispatch/middleware/params_parser.rb
@@ -37,29 +37,11 @@ module ActionDispatch
def call(env)
request = Request.new(env)
- parse_formatted_parameters(request, @parsers) do |params|
- request.request_parameters = params
- end
+ request.params_parsers = @parsers
+
+ request.request_parameters
@app.call(env)
end
-
- private
- def parse_formatted_parameters(request, parsers)
- return if request.content_length.zero?
-
- strategy = parsers.fetch(request.content_mime_type) { return nil }
-
- yield strategy.call(request.raw_post)
-
- rescue => e # JSON or Ruby code block errors
- logger(request).debug "Error occurred while parsing request parameters.\nContents:\n\n#{request.raw_post}"
-
- raise ParseError.new(e.message, e)
- end
-
- def logger(request)
- request.logger || ActiveSupport::Logger.new($stderr)
- end
end
end