mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
52cf1a71b3
Now that we have encoding strategies, we can just walk the params hash once to encode as HWIA, and remove nils.
55 lines
1.6 KiB
Ruby
55 lines
1.6 KiB
Ruby
require 'active_support/core_ext/hash/conversions'
|
|
require 'action_dispatch/http/request'
|
|
require 'active_support/core_ext/hash/indifferent_access'
|
|
|
|
module ActionDispatch
|
|
class ParamsParser
|
|
class ParseError < StandardError
|
|
attr_reader :original_exception
|
|
|
|
def initialize(message, original_exception)
|
|
super(message)
|
|
@original_exception = original_exception
|
|
end
|
|
end
|
|
|
|
DEFAULT_PARSERS = {
|
|
Mime::JSON => lambda { |raw_post|
|
|
data = ActiveSupport::JSON.decode(raw_post)
|
|
data = {:_json => data} unless data.is_a?(Hash)
|
|
Request::Utils.normalize_encode_params(data)
|
|
}
|
|
}
|
|
|
|
def initialize(app, parsers = {})
|
|
@app, @parsers = app, DEFAULT_PARSERS.merge(parsers)
|
|
end
|
|
|
|
def call(env)
|
|
default = env["action_dispatch.request.request_parameters"]
|
|
env["action_dispatch.request.request_parameters"] = parse_formatted_parameters(env, @parsers, default)
|
|
|
|
@app.call(env)
|
|
end
|
|
|
|
private
|
|
def parse_formatted_parameters(env, parsers, default)
|
|
request = Request.new(env)
|
|
|
|
return default if request.content_length.zero?
|
|
|
|
strategy = parsers.fetch(request.content_mime_type) { return default }
|
|
|
|
strategy.call(request.raw_post)
|
|
|
|
rescue => e # JSON or Ruby code block errors
|
|
logger(env).debug "Error occurred while parsing request parameters.\nContents:\n\n#{request.raw_post}"
|
|
|
|
raise ParseError.new(e.message, e)
|
|
end
|
|
|
|
def logger(env)
|
|
env['action_dispatch.logger'] || ActiveSupport::Logger.new($stderr)
|
|
end
|
|
end
|
|
end
|