class Hanami::Routing::Parsers
@since 0.2.0 @api private
Constants
- CONTENT_TYPE
@since 0.2.0 @api private
- FALLBACK_KEY
@api private
- MEDIA_TYPE_MATCHER
@since 0.2.0 @api private
- RACK_INPUT
@since 0.2.0 @api private
- ROUTER_PARAMS
@since 0.2.0 @api private
- ROUTER_PARSED_BODY
@api private
Public Class Methods
new(parsers)
click to toggle source
@since 0.2.0 @api private
# File lib/hanami/routing/parsers.rb, line 33 def initialize(parsers) @parsers = prepare(parsers) _redefine_call end
Public Instance Methods
call(env)
click to toggle source
@since 0.2.0 @api private
# File lib/hanami/routing/parsers.rb, line 40 def call(env) env end
Private Instance Methods
_parse(env, body)
click to toggle source
@api private
# File lib/hanami/routing/parsers.rb, line 93 def _parse(env, body) @parsers[ media_type(env) ].parse(body) end
_redefine_call()
click to toggle source
@since 0.2.0 @api private
# File lib/hanami/routing/parsers.rb, line 66 def _redefine_call return if @parsers.empty? define_singleton_method :call do |env| body = env[RACK_INPUT].read return env if body.empty? env[RACK_INPUT].rewind # somebody might try to read this stream env[ROUTER_PARAMS] ||= {} # prepare params env[ROUTER_PARSED_BODY] = _parse(env, body) env[ROUTER_PARAMS] = _symbolize(env[ROUTER_PARSED_BODY]).merge(env[ROUTER_PARAMS]) env end end
_symbolize(body)
click to toggle source
@api private
# File lib/hanami/routing/parsers.rb, line 84 def _symbolize(body) if body.is_a?(Hash) Utils::Hash.deep_symbolize(body) else { FALLBACK_KEY => body } end end
content_type(env)
click to toggle source
@api private
# File lib/hanami/routing/parsers.rb, line 107 def content_type(env) content_type = env[CONTENT_TYPE] content_type.nil? || content_type.empty? ? nil : content_type end
media_type(env)
click to toggle source
@api private
# File lib/hanami/routing/parsers.rb, line 100 def media_type(env) if ct = content_type(env) ct.split(MEDIA_TYPE_MATCHER, 2).first.downcase end end
prepare(args)
click to toggle source
@since 0.2.0 @api private
# File lib/hanami/routing/parsers.rb, line 47 def prepare(args) result = Hash.new args = Array(args) return result if args.empty? args.each do |arg| parser = Parsing::Parser.for(arg) parser.mime_types.each do |mime| result[mime] = parser end end result.default = Parsing::Parser.new result end