From b93c226d19615fe504f9e12d6c0ee2d70683e5fa Mon Sep 17 00:00:00 2001
From: Aaron Patterson <aaron.patterson@gmail.com>
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(-)

(limited to 'actionpack')

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