mirror of
https://github.com/puma/puma.git
synced 2022-11-09 13:48:40 -05:00
d39fe92a2d
* Fix crash when no_token is set * Use a more meaningful name instead of an empty string * Adds a test to ensure `{ no_token: true }` works * Adds an explanation for the usage of a String Just to justify the use of a String instead of a Symbol. * Removes thread that would start the server This removes the part of the test that would start the server. The reason why the thread was being created originally in the PR was to ensure that the server was booting even with `{ no_token: true }`. I believe we don't need to test the full server boot but just ensure that we won't pass a Symbol to OptionParser. In particular the test ensures that the token will be set to `'none'` when `no_token: true`. There're already other tests testing that the server boots.
184 lines
4.3 KiB
Ruby
184 lines
4.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'puma/server'
|
|
require 'puma/const'
|
|
|
|
module Puma
|
|
# Generic class that is used by `Puma::Cluster` and `Puma::Single` to
|
|
# serve requests. This class spawns a new instance of `Puma::Server` via
|
|
# a call to `start_server`.
|
|
class Runner
|
|
def initialize(cli, events)
|
|
@launcher = cli
|
|
@events = events
|
|
@options = cli.options
|
|
@app = nil
|
|
@control = nil
|
|
end
|
|
|
|
def daemon?
|
|
@options[:daemon]
|
|
end
|
|
|
|
def development?
|
|
@options[:environment] == "development"
|
|
end
|
|
|
|
def test?
|
|
@options[:environment] == "test"
|
|
end
|
|
|
|
def log(str)
|
|
@events.log str
|
|
end
|
|
|
|
def before_restart
|
|
@control.stop(true) if @control
|
|
end
|
|
|
|
def error(str)
|
|
@events.error str
|
|
end
|
|
|
|
def debug(str)
|
|
@events.log "- #{str}" if @options[:debug]
|
|
end
|
|
|
|
def start_control
|
|
str = @options[:control_url]
|
|
return unless str
|
|
|
|
require 'puma/app/status'
|
|
|
|
uri = URI.parse str
|
|
|
|
app = Puma::App::Status.new @launcher
|
|
|
|
if token = @options[:control_auth_token]
|
|
app.auth_token = token unless token.empty? || token == 'none'
|
|
end
|
|
|
|
control = Puma::Server.new app, @launcher.events
|
|
control.min_threads = 0
|
|
control.max_threads = 1
|
|
|
|
case uri.scheme
|
|
when "tcp"
|
|
log "* Starting control server on #{str}"
|
|
control.add_tcp_listener uri.host, uri.port
|
|
when "unix"
|
|
log "* Starting control server on #{str}"
|
|
path = "#{uri.host}#{uri.path}"
|
|
mask = @options[:control_url_umask]
|
|
|
|
control.add_unix_listener path, mask
|
|
else
|
|
error "Invalid control URI: #{str}"
|
|
end
|
|
|
|
control.run
|
|
@control = control
|
|
end
|
|
|
|
def ruby_engine
|
|
if !defined?(RUBY_ENGINE) || RUBY_ENGINE == "ruby"
|
|
"ruby #{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}"
|
|
else
|
|
if defined?(RUBY_ENGINE_VERSION)
|
|
"#{RUBY_ENGINE} #{RUBY_ENGINE_VERSION} - ruby #{RUBY_VERSION}"
|
|
else
|
|
"#{RUBY_ENGINE} #{RUBY_VERSION}"
|
|
end
|
|
end
|
|
end
|
|
|
|
def output_header(mode)
|
|
min_t = @options[:min_threads]
|
|
max_t = @options[:max_threads]
|
|
|
|
log "Puma starting in #{mode} mode..."
|
|
log "* Version #{Puma::Const::PUMA_VERSION} (#{ruby_engine}), codename: #{Puma::Const::CODE_NAME}"
|
|
log "* Min threads: #{min_t}, max threads: #{max_t}"
|
|
log "* Environment: #{ENV['RACK_ENV']}"
|
|
|
|
if @options[:mode] == :tcp
|
|
log "* Mode: Lopez Express (tcp)"
|
|
end
|
|
end
|
|
|
|
def redirected_io?
|
|
@options[:redirect_stdout] || @options[:redirect_stderr]
|
|
end
|
|
|
|
def redirect_io
|
|
stdout = @options[:redirect_stdout]
|
|
stderr = @options[:redirect_stderr]
|
|
append = @options[:redirect_append]
|
|
|
|
if stdout
|
|
unless Dir.exist?(File.dirname(stdout))
|
|
raise "Cannot redirect STDOUT to #{stdout}"
|
|
end
|
|
|
|
STDOUT.reopen stdout, (append ? "a" : "w")
|
|
STDOUT.sync = true
|
|
STDOUT.puts "=== puma startup: #{Time.now} ==="
|
|
end
|
|
|
|
if stderr
|
|
unless Dir.exist?(File.dirname(stderr))
|
|
raise "Cannot redirect STDERR to #{stderr}"
|
|
end
|
|
|
|
STDERR.reopen stderr, (append ? "a" : "w")
|
|
STDERR.sync = true
|
|
STDERR.puts "=== puma startup: #{Time.now} ==="
|
|
end
|
|
end
|
|
|
|
def load_and_bind
|
|
unless @launcher.config.app_configured?
|
|
error "No application configured, nothing to run"
|
|
exit 1
|
|
end
|
|
|
|
# Load the app before we daemonize.
|
|
begin
|
|
@app = @launcher.config.app
|
|
rescue Exception => e
|
|
log "! Unable to load application: #{e.class}: #{e.message}"
|
|
raise e
|
|
end
|
|
|
|
@launcher.binder.parse @options[:binds], self
|
|
end
|
|
|
|
def app
|
|
@app ||= @launcher.config.app
|
|
end
|
|
|
|
def start_server
|
|
min_t = @options[:min_threads]
|
|
max_t = @options[:max_threads]
|
|
|
|
server = Puma::Server.new app, @launcher.events, @options
|
|
server.min_threads = min_t
|
|
server.max_threads = max_t
|
|
server.inherit_binder @launcher.binder
|
|
|
|
if @options[:mode] == :tcp
|
|
server.tcp_mode!
|
|
end
|
|
|
|
if @options[:early_hints]
|
|
server.early_hints = true
|
|
end
|
|
|
|
unless development? || test?
|
|
server.leak_stack_on_error = false
|
|
end
|
|
|
|
server
|
|
end
|
|
end
|
|
end
|