提交 b93c226d 编写于 作者: A Aaron Patterson

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).
上级 91d05082
......@@ -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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册