class Drillbit::Middleware::ParameterParser

Public Class Methods

new(app) click to toggle source
# File lib/drillbit/middleware/parameter_parser.rb, line 11
def initialize(app)
  @app = app
end

Public Instance Methods

call(env) click to toggle source
# File lib/drillbit/middleware/parameter_parser.rb, line 15
def call(env)
  env['QUERY_STRING'] = underscore_query_string(env['QUERY_STRING'])

  if env['CONTENT_LENGTH'].to_i.positive? && env['CONTENT_TYPE'] =~ /json/
    if env['rack.input']
      underscored_input     = underscore_request_parameters(env['rack.input'])
      env['rack.input']     = StringIO.new(underscored_input)
      env['CONTENT_LENGTH'] = underscored_input.bytesize
    elsif env['RACK_INPUT']
      env['RACK_INPUT']     = underscore_request_parameters(env['RACK_INPUT'])
      env['CONTENT_LENGTH'] = env['RACK_INPUT'].bytesize
    end
  end

  @app.call(env)
rescue JSON::ParserError => _error
  return Responses::InvalidRequestBody.call(env)
end

Private Instance Methods

underscore_parameters(parameters) click to toggle source
# File lib/drillbit/middleware/parameter_parser.rb, line 59
def underscore_parameters(parameters)
  return parameters unless parameters.is_a? Hash

  parameters.each_with_object({}) do |(key, value), hash|
    value = case value
            when Hash
              underscore_parameters(value)
            when Array
              value.map do |item|
                underscore_parameters(item)
              end
            else
              value
            end

    hash[Drillbit::Utilities::String.underscore(key)] = value
  end
end
underscore_query_string(query_string) click to toggle source
# File lib/drillbit/middleware/parameter_parser.rb, line 48
def underscore_query_string(query_string)
  return query_string unless query_string.respond_to? :gsub

  query_string.gsub(/(?<=\A|&|\?)[^=&]+/) do |match|
    unescaped   = CGI.unescape(match)
    underscored = Drillbit::Utilities::String.underscore(unescaped)

    CGI.escape(underscored)
  end
end
underscore_request_parameters(request_parameters) click to toggle source
# File lib/drillbit/middleware/parameter_parser.rb, line 36
def underscore_request_parameters(request_parameters)
  request_parameter_string = if request_parameters.respond_to?(:read)
                               request_parameters.read
                             else
                               request_parameters.to_s
                             end
  data                     = JSON.parse(request_parameter_string)
  data                     = underscore_parameters(data)

  JSON.dump(data)
end