Module: Rack::Handler::Puma

Defined in:
lib/rack/handler/puma.rb

Constant Summary collapse

DEFAULT_OPTIONS =
{
  :Verbose => false,
  :Silent  => false
}

Class Method Summary collapse

Class Method Details

.config(app, options = {}) ⇒ Object

[View source]

13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/rack/handler/puma.rb', line 13

def self.config(app, options = {})
  require 'puma'
  require 'puma/configuration'
  require 'puma/events'
  require '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

  conf = ::Puma::Configuration.new(options, default_options) do |user_config, file_config, default_config|
    if options.delete(:Verbose)
      require 'rack/common_logger'
      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| ... } ⇒ Object

Yields:

  • (launcher)
[View source]

63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/rack/handler/puma.rb', line 63

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

  events = options.delete(:Silent) ? ::Puma::Events.strings : ::Puma::Events.stdio

  launcher = ::Puma::Launcher.new(conf, :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) ⇒ Object

[View source]

89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/rack/handler/puma.rb', line 89

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

  if host && (host[0,1] == '.' || host[0,1] == '/')
    config.bind "unix://#{host}"
  elsif host && host =~ /^ssl:\/\//
    uri = URI.parse(host)
    uri.port ||= port || ::Puma::Configuration::DefaultTCPPort
    config.bind uri.to_s
  else

    if host
      port ||= ::Puma::Configuration::DefaultTCPPort
    end

    if port
      host ||= ::Puma::Configuration::DefaultTCPHost
      config.port port, host
    end
  end
end

.valid_optionsObject

[View source]

80
81
82
83
84
85
86
87
# File 'lib/rack/handler/puma.rb', line 80

def self.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