aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAaron Patterson <aaron.patterson@gmail.com>2015-09-18 11:46:51 -0700
committerAaron Patterson <aaron.patterson@gmail.com>2015-09-18 11:46:51 -0700
commitb93c226d19615fe504f9e12d6c0ee2d70683e5fa (patch)
treecd3cdb9234445e13a7fecaec2f4014f2c4122dbc
parent91d05082e43008f2617d468fdd6c0de95855fe7f (diff)
downloadrails-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.rb35
-rw-r--r--actionpack/lib/action_dispatch/http/request.rb25
-rw-r--r--actionpack/lib/action_dispatch/middleware/params_parser.rb14
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