Sha256: e0f53c9472b0a1c6832be42a5a806a20c661b8609677d14be0ad45e8b961a739

Contents?: true

Size: 1.36 KB

Versions: 3

Compression:

Stored size: 1.36 KB

Contents

# frozen_string_literal: true
require 'json'
require 'stringio'
require 'drillbit/responses/invalid_request_body'

module  Drillbit
module  Middleware
class   ParameterParser
  def initialize(app)
    @app = app
  end

  def call(env)
    env['QUERY_STRING'] = underscore_query_string(env['QUERY_STRING'])

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

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

  private

  def underscore_request_parameters(request_parameters)
    data = JSON.load(request_parameters)
    data = underscore_parameters(data)

    JSON.dump(data)
  end

  def underscore_query_string(query_string)
    return query_string unless query_string.respond_to? :gsub

    query_string.gsub(/(?<=\A|&|\?)[^=&]+/) do |match|
      match.tr('-', '_')
    end
  end

  def underscore_parameters(parameters)
    return parameters unless parameters.is_a? Hash

    parameters.each_with_object({}) do |(key, value), hash|
      value = underscore_parameters(value) if value.is_a? Hash

      hash[key.tr('-', '_')] = value
    end
  end
end
end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
drillbit-2.3.1 lib/drillbit/middleware/parameter_parser.rb
drillbit-2.3.0 lib/drillbit/middleware/parameter_parser.rb
drillbit-2.2.2 lib/drillbit/middleware/parameter_parser.rb