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).
This commit is contained in:
parent
91d05082e4
commit
b93c226d19
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user