1
0
Fork 0
mirror of https://github.com/puma/puma.git synced 2022-11-09 13:48:40 -05:00
puma--puma/lib/puma/runner.rb
Jesús Burgos Maciá d39fe92a2d Fixes the bug that wouldn't allow no_token be set to true (#1803)
* 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.
2019-05-28 09:37:34 -04:00

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