lib/puma/configuration.rb in piesync-puma-3.12.6.1 vs lib/puma/configuration.rb in piesync-puma-5.4.0.1
- old
+ new
@@ -18,11 +18,11 @@
# A class used for storing "leveled" configuration options.
#
# In this class any "user" specified options take precedence over any
# "file" specified options, take precedence over any "default" options.
#
- # User input is prefered over "defaults":
+ # User input is preferred over "defaults":
# user_options = { foo: "bar" }
# default_options = { foo: "zoo" }
# options = UserFileDefaultOptions.new(user_options, default_options)
# puts options[:foo]
# # => "bar"
@@ -30,11 +30,11 @@
# All values can be accessed via `all_of`
#
# puts options.all_of(:foo)
# # => ["bar", "zoo"]
#
- # A "file" option can be set. This config will be prefered over "default" options
+ # A "file" option can be set. This config will be preferred over "default" options
# but will defer to any available "user" specified options.
#
# user_options = { foo: "bar" }
# default_options = { rackup: "zoo.rb" }
# options = UserFileDefaultOptions.new(user_options, default_options)
@@ -52,21 +52,23 @@
end
attr_reader :user_options, :file_options, :default_options
def [](key)
- return user_options[key] if user_options.key?(key)
- return file_options[key] if file_options.key?(key)
- return default_options[key] if default_options.key?(key)
+ fetch(key)
end
def []=(key, value)
user_options[key] = value
end
def fetch(key, default_value = nil)
- self[key] || default_value
+ return user_options[key] if user_options.key?(key)
+ return file_options[key] if file_options.key?(key)
+ return default_options[key] if default_options.key?(key)
+
+ default_value
end
def all_of(key)
user = user_options[key]
file = file_options[key]
@@ -88,10 +90,16 @@
if v.respond_to? :call
@default_options[k] = v.call
end
end
end
+
+ def final_options
+ default_options
+ .merge(file_options)
+ .merge(user_options)
+ end
end
# The main configuration class of Puma.
#
# It can be initialized with a set of "user" options and "default" options.
@@ -104,20 +112,21 @@
# class powers the Puma config file syntax and does double duty as a configuration
# DSL used by the `Puma::CLI` and Puma rack handler.
#
# It also handles loading plugins.
#
- # > Note: `:port` and `:host` are not valid keys. By they time they make it to the
+ # [Note:]
+ # `:port` and `:host` are not valid keys. By the time they make it to the
# configuration options they are expected to be incorporated into a `:binds` key.
# Under the hood the DSL maps `port` and `host` calls to `:binds`
#
- # config = Configuration.new({}) do |user_config, file_config, default_config|
- # user_config.port 3003
- # end
- # config.load
- # puts config.options[:port]
- # # => 3003
+ # config = Configuration.new({}) do |user_config, file_config, default_config|
+ # user_config.port 3003
+ # end
+ # config.load
+ # puts config.options[:port]
+ # # => 3003
#
# It is expected that `load` is called on the configuration instance after setting
# config. This method expands any values in `config_file` and puts them into the
# correct configuration option hash.
#
@@ -135,10 +144,14 @@
@plugins = PluginLoader.new
@user_dsl = DSL.new(@options.user_options, self)
@file_dsl = DSL.new(@options.file_options, self)
@default_dsl = DSL.new(@options.default_options, self)
+ if !@options[:prune_bundler]
+ default_options[:preload_app] = (@options[:workers] > 1) && Puma.forkable?
+ end
+
if block
configure(&block)
end
end
@@ -165,30 +178,39 @@
def flatten!
@options = @options.flatten
self
end
+ # @version 5.0.0
+ def default_max_threads
+ Puma.mri? ? 5 : 16
+ end
+
def puma_default_options
{
- :min_threads => 0,
- :max_threads => 16,
+ :min_threads => Integer(ENV['PUMA_MIN_THREADS'] || ENV['MIN_THREADS'] || 0),
+ :max_threads => Integer(ENV['PUMA_MAX_THREADS'] || ENV['MAX_THREADS'] || default_max_threads),
:log_requests => false,
:debug => false,
:binds => ["tcp://#{DefaultTCPHost}:#{DefaultTCPPort}"],
- :workers => 0,
- :daemon => false,
+ :workers => Integer(ENV['WEB_CONCURRENCY'] || 0),
+ :silence_single_worker_warning => false,
:mode => :http,
:worker_timeout => DefaultWorkerTimeout,
:worker_boot_timeout => DefaultWorkerTimeout,
:worker_shutdown_timeout => DefaultWorkerShutdownTimeout,
:remote_address => :socket,
:tag => method(:infer_tag),
- :environment => -> { ENV['RACK_ENV'] || "development" },
+ :environment => -> { ENV['RACK_ENV'] || ENV['RAILS_ENV'] || "development" },
:rackup => DefaultRackup,
:logger => STDOUT,
:persistent_timeout => Const::PERSISTENT_TIMEOUT,
- :first_data_timeout => Const::FIRST_DATA_TIMEOUT
+ :first_data_timeout => Const::FIRST_DATA_TIMEOUT,
+ :raise_exception_on_sigterm => true,
+ :max_fast_inline => Const::MAX_FAST_INLINE,
+ :io_selector_backend => :auto,
+ :mutate_stdout_and_stderr_to_sync_on_write => true,
}
end
def load
config_files.each { |config_file| @file_dsl._load_from(config_file) }
@@ -242,18 +264,10 @@
# the rackup file, and set @app.
#
def app
found = options[:app] || load_rackup
- if @options[:mode] == :tcp
- require 'puma/tcp_logger'
-
- logger = @options[:logger]
- quiet = !@options[:log_requests]
- return TCPLogger.new(logger, found, quiet)
- end
-
if @options[:log_requests]
require 'puma/commonlogger'
logger = @options[:logger]
found = CommonLogger.new(found, logger)
end
@@ -272,14 +286,25 @@
def load_plugin(name)
@plugins.create name
end
- def run_hooks(key, arg)
- @options.all_of(key).each { |b| b.call arg }
+ def run_hooks(key, arg, events)
+ @options.all_of(key).each do |b|
+ begin
+ b.call arg
+ rescue => e
+ events.log "WARNING hook #{key} failed with exception (#{e.class}) #{e.message}"
+ events.debug e.backtrace.join("\n")
+ end
+ end
end
+ def final_options
+ @options.final_options
+ end
+
def self.temp_path
require 'tmpdir'
t = (Time.now.to_f * 1000).to_i
"#{Dir.tmpdir}/puma-status-#{t}-#{$$}"
@@ -316,10 +341,12 @@
def load_rackup
raise "Missing rackup file '#{rackup}'" unless File.exist?(rackup)
rack_app, rack_options = rack_builder.parse_file(rackup)
+ rack_options = rack_options || {}
+
@options.file_options.merge!(rack_options)
config_ru_binds = []
rack_options.each do |k, v|
config_ru_binds << v if k.to_s.start_with?("bind")
@@ -329,32 +356,12 @@
rack_app
end
def self.random_token
- begin
- require 'openssl'
- rescue LoadError
- end
+ require 'securerandom' unless defined?(SecureRandom)
- count = 16
-
- bytes = nil
-
- if defined? OpenSSL::Random
- bytes = OpenSSL::Random.random_bytes(count)
- elsif File.exist?("/dev/urandom")
- File.open('/dev/urandom') { |f| bytes = f.read(count) }
- end
-
- if bytes
- token = "".dup
- bytes.each_byte { |b| token << b.to_s(16) }
- else
- token = (0..count).to_a.map { rand(255).to_s(16) }.join
- end
-
- return token
+ SecureRandom.hex(16)
end
end
end
require 'puma/dsl'