diff --git a/actionpack/lib/action_dispatch/http/parameters.rb b/actionpack/lib/action_dispatch/http/parameters.rb index 3c9f8cd9e4468258ace888ce85258ce1543f297a..3867e514a2d623e428f95ebb99e2f535e9acdcec 100644 --- a/actionpack/lib/action_dispatch/http/parameters.rb +++ b/actionpack/lib/action_dispatch/http/parameters.rb @@ -3,6 +3,20 @@ module Http 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 @@ def path_parameters=(parameters) #:nodoc: 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 ea083425bac8f2e50270bc932e1e44a98ffaf0ba..cb5951061348dc737b1f775c09be593c9f606faf 100644 --- a/actionpack/lib/action_dispatch/http/request.rb +++ b/actionpack/lib/action_dispatch/http/request.rb @@ -361,16 +361,6 @@ def POST 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 @@ def check_method(name) 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 00c3324b068dc90fee31039560d6d072170d89d0..ef554010158517d8e2827b44322cfe866c986ad9 100644 --- a/actionpack/lib/action_dispatch/middleware/params_parser.rb +++ b/actionpack/lib/action_dispatch/middleware/params_parser.rb @@ -18,26 +18,16 @@ def initialize(message, original_exception) 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