class Hanami::Middleware::BodyParser
@since 1.3.0 @api private
@since 1.3.0 @api private
Constants
- CONTENT_TYPE
@since 1.3.0 @api private
- FALLBACK_KEY
@api private
- MEDIA_TYPE_MATCHER
@since 1.3.0 @api private
- RACK_INPUT
@since 1.3.0 @api private
- ROUTER_PARAMS
@since 1.3.0 @api private
- ROUTER_PARSED_BODY
@api private
Public Class Methods
new(app, parsers)
click to toggle source
# File lib/hanami/middleware/body_parser.rb, line 33 def initialize(app, parsers) @app = app @parsers = build_parsers(parsers) end
Public Instance Methods
call(env)
click to toggle source
# File lib/hanami/middleware/body_parser.rb, line 38 def call(env) body = env[RACK_INPUT].read return @app.call(env) if body.empty? env[RACK_INPUT].rewind # somebody might try to read this stream if (parser = @parsers[media_type(env)]) env[ROUTER_PARSED_BODY] = parser.parse(body) env[ROUTER_PARAMS] = _symbolize(env[ROUTER_PARSED_BODY]) end @app.call(env) end
Private Instance Methods
_parse(env, body)
click to toggle source
@api private
# File lib/hanami/middleware/body_parser.rb, line 77 def _parse(env, body) @parsers[ media_type(env) ].parse(body) end
_symbolize(body)
click to toggle source
@api private
# File lib/hanami/middleware/body_parser.rb, line 68 def _symbolize(body) if body.is_a?(Hash) Utils::Hash.deep_symbolize(body) else { FALLBACK_KEY => body } end end
build_parsers(parser_names)
click to toggle source
# File lib/hanami/middleware/body_parser.rb, line 54 def build_parsers(parser_names) parser_names = Array(parser_names) return {} if parser_names.empty? parser_names.each_with_object({}) { |name, parsers| parser = self.class.for(name) parser.mime_types.each do |mime| parsers[mime] = parser end } end
content_type(env)
click to toggle source
@api private
# File lib/hanami/middleware/body_parser.rb, line 91 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/middleware/body_parser.rb, line 84 def media_type(env) if ct = content_type(env) ct.split(MEDIA_TYPE_MATCHER, 2).first.downcase end end