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'