123456789_123456789_123456789_123456789_123456789_

Module: Puma::RackHandler

Relationships & Source Files
Extension / Inclusion / Inheritance Descendants
Extended In:
Defined in: lib/rack/handler/puma.rb

Overview

This module is used as an ‘include’ file in code at bottom of file. It loads into either ::Rackup::Handler::Puma or ::Rack::Handler::Puma.

Constant Summary

Instance Method Summary

Instance Method Details

#config(app, options = {})

[ GitHub ]

  
# File 'lib/rack/handler/puma.rb', line 14

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

#run(app, **options) {|launcher| ... }

Yields:

  • (launcher)
[ GitHub ]

  
# File 'lib/rack/handler/puma.rb', line 70

def run(app, **options)
  conf = self.config(app, options)

  log_writer = options.delete(:Silent) ? ::Puma::LogWriter.strings : ::Puma::LogWriter.stdio

  launcher = ::Puma::Launcher.new(conf, :log_writer => log_writer, events: @events)

  yield launcher if block_given?
  begin
    launcher.run
  rescue Interrupt
    puts "* Gracefully stopping, waiting for requests to finish"
    launcher.stop
    puts "* Goodbye!"
  end
end

#set_host_port_to_config(host, port, config)

[ GitHub ]

  
# File 'lib/rack/handler/puma.rb', line 96

def set_host_port_to_config(host, port, config)
  config.clear_binds! if host || port

  if host&.start_with? '.', '/', '@'
    config.bind "unix://#{host}"
  elsif host&.start_with? 'ssl://'
    uri = URI.parse(host)
    uri.port ||= port || ::Puma::Configuration::DEFAULTS[:tcp_port]
    config.bind uri.to_s
  else

    if host
      port ||= ::Puma::Configuration::DEFAULTS[:tcp_port]
    end

    if port
      host ||= ::Puma::Configuration::DEFAULTS[:tcp_host]
      config.port port, host
    end
  end
end

#valid_options

[ GitHub ]

  
# File 'lib/rack/handler/puma.rb', line 87

def valid_options
  {
    "Host=HOST"       => "Hostname to listen on (default: localhost)",
    "Port=PORT"       => "Port to listen on (default: 8080)",
    "Threads=MIN:MAX" => "min:max threads to use (default 0:16)",
    "Verbose"         => "Don't report each request (default: false)"
  }
end