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