diff options
author | Aaron Patterson <aaron.patterson@gmail.com> | 2015-09-18 11:46:51 -0700 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2015-09-18 11:46:51 -0700 |
commit | b93c226d19615fe504f9e12d6c0ee2d70683e5fa (patch) | |
tree | cd3cdb9234445e13a7fecaec2f4014f2c4122dbc | |
parent | 91d05082e43008f2617d468fdd6c0de95855fe7f (diff) | |
download | rails-b93c226d19615fe504f9e12d6c0ee2d70683e5fa.tar.gz rails-b93c226d19615fe504f9e12d6c0ee2d70683e5fa.tar.bz2 rails-b93c226d19615fe504f9e12d6c0ee2d70683e5fa.zip |
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).
-rw-r--r-- | actionpack/lib/action_dispatch/http/parameters.rb | 35 | ||||
-rw-r--r-- | actionpack/lib/action_dispatch/http/request.rb | 25 | ||||
-rw-r--r-- | actionpack/lib/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 |