1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00
rails--rails/actionpack/lib/action_dispatch/middleware/params_parser.rb
Aaron Patterson 52cf1a71b3 rm deep_munge. You will live on in our hearts (and git history)
Now that we have encoding strategies, we can just walk the params hash
once to encode as HWIA, and remove nils.
2015-07-21 18:14:18 -07:00

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