diff options
author | Aaron Patterson <aaron.patterson@gmail.com> | 2015-09-18 11:19:04 -0700 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2015-09-18 11:19:04 -0700 |
commit | 3efb0bcdafc524cbbb002455b9bbc1233e43a868 (patch) | |
tree | 33d0d9af1acd60f78ee1b3a4790b904461f1a6b6 /actionpack | |
parent | 76c7162c1d63dc8a7a324913f0a7ba9d3f9165ec (diff) | |
download | rails-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')
-rw-r--r-- | actionpack/lib/action_dispatch/http/request.rb | 35 | ||||
-rw-r--r-- | actionpack/lib/action_dispatch/middleware/params_parser.rb | 24 |
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 |