module Puma::RackHandler

def config(app, options = {})

def config(app, options = {})
  require_relative '../../puma'
  require_relative '../../puma/configuration'
  require_relative '../../puma/log_writer'
  require_relative '../../puma/launcher'
  default_options = DEFAULT_OPTIONS.dup
  # Libraries pass in values such as :Port and there is no way to determine
  # if it is a default provided by the library or a special value provided
  # by the user. A special key `user_supplied_options` can be passed. This
  # contains an array of all explicitly defined user options. We then
  # know that all other values are defaults
  if user_supplied_options = options.delete(:user_supplied_options)
    (options.keys - user_supplied_options).each do |k|
      default_options[k] = options.delete(k)
    end
  end
  @events = options[:events] || ::Puma::Events.new
  conf = ::Puma::Configuration.new(options, default_options.merge({events: @events})) do |user_config, file_config, default_config|
    if options.delete(:Verbose)
      begin
        require 'rack/commonlogger'  # Rack 1.x
      rescue LoadError
        require 'rack/common_logger' # Rack 2 and later
      end
      app = ::Rack::CommonLogger.new(app, STDOUT)
    end
    if options[:environment]
      user_config.environment options[:environment]
    end
    if options[:Threads]
      min, max = options.delete(:Threads).split(':', 2)
      user_config.threads min, max
    end
    if options[:Host] || options[:Port]
      host = options[:Host] || default_options[:Host]
      port = options[:Port] || default_options[:Port]
      self.set_host_port_to_config(host, port, user_config)
    end
    if default_options[:Host]
      file_config.set_default_host(default_options[:Host])
    end
    self.set_host_port_to_config(default_options[:Host], default_options[:Port], default_config)
    user_config.app app
  end
  conf
end