From b93c226d19615fe504f9e12d6c0ee2d70683e5fa Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Fri, 18 Sep 2015 11:46:51 -0700 Subject: push the parameter parsers on to the class The middleware stack is a singleton in the application (one instance is shared for the entire application) which means that there was only one opportunity to set the parameter parsers. Since there is only one set of parameter parsers in an app, lets just configure them on the request class (since that is where they are used). --- actionpack/lib/action_dispatch/http/parameters.rb | 35 ++++++++++++++++++++++ actionpack/lib/action_dispatch/http/request.rb | 25 ---------------- .../action_dispatch/middleware/params_parser.rb | 14 ++------- 3 files changed, 37 insertions(+), 37 deletions(-) diff --git a/actionpack/lib/action_dispatch/http/parameters.rb b/actionpack/lib/action_dispatch/http/parameters.rb index 3c9f8cd9e4..3867e514a2 100644 --- a/actionpack/lib/action_dispatch/http/parameters.rb +++ b/actionpack/lib/action_dispatch/http/parameters.rb @@ -3,6 +3,20 @@ module ActionDispatch module Parameters PARAMETERS_KEY = 'action_dispatch.request.path_parameters' + DEFAULT_PARSERS = { + Mime::JSON => lambda { |raw_post| + data = ActiveSupport::JSON.decode(raw_post) + data.is_a?(Hash) ? data : {:_json => data} + } + } + + def self.included(klass) + class << klass + attr_accessor :parameter_parsers + end + + klass.parameter_parsers = DEFAULT_PARSERS + end # Returns both GET and POST \parameters in a single hash. def parameters params = get_header("action_dispatch.request.parameters") @@ -31,6 +45,27 @@ module ActionDispatch def path_parameters get_header(PARAMETERS_KEY) || {} end + + private + + def parse_formatted_parameters(request, parsers) + return yield if request.content_length.zero? + + strategy = parsers.fetch(request.content_mime_type) { return yield } + + begin + strategy.call(request.raw_post) + 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}" + + raise ParamsParser::ParseError.new(e.message, e) + end + end + + def params_parsers + ActionDispatch::Request.parameter_parsers + end end end end diff --git a/actionpack/lib/action_dispatch/http/request.rb b/actionpack/lib/action_dispatch/http/request.rb index ea083425ba..cb59510613 100644 --- a/actionpack/lib/action_dispatch/http/request.rb +++ b/actionpack/lib/action_dispatch/http/request.rb @@ -361,16 +361,6 @@ module ActionDispatch 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 @@ -399,20 +389,5 @@ 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) - return yield if request.content_length.zero? - - strategy = parsers.fetch(request.content_mime_type) { return yield } - - begin - strategy.call(request.raw_post) - 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}" - - raise ParamsParser::ParseError.new(e.message, e) - end - end end end diff --git a/actionpack/lib/action_dispatch/middleware/params_parser.rb b/actionpack/lib/action_dispatch/middleware/params_parser.rb index 00c3324b06..ef55401015 100644 --- a/actionpack/lib/action_dispatch/middleware/params_parser.rb +++ b/actionpack/lib/action_dispatch/middleware/params_parser.rb @@ -18,26 +18,16 @@ module ActionDispatch end end - DEFAULT_PARSERS = { - Mime::JSON => lambda { |raw_post| - data = ActiveSupport::JSON.decode(raw_post) - data.is_a?(Hash) ? data : {:_json => data} - } - } - # Create a new +ParamsParser+ middleware instance. # # The +parsers+ argument can take Hash of parsers where key is identifying # content mime type, and value is a lambda that is going to process data. def initialize(app, parsers = {}) - @app, @parsers = app, DEFAULT_PARSERS.merge(parsers) + @app = app + ActionDispatch::Request.parameter_parsers = ActionDispatch::Request::DEFAULT_PARSERS.merge(parsers) end def call(env) - request = Request.new(env) - - request.params_parsers = @parsers - @app.call(env) end end -- cgit v1.2.3