-
Notifications
You must be signed in to change notification settings - Fork 1
Fixup code for use with rackup gem (may be used with rack 3) (#3061) #10
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: pr_060_before
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
| @@ -1,114 +1,136 @@ | ||||||
| # frozen_string_literal: true | ||||||
|
|
||||||
| require 'rack/handler' | ||||||
|
|
||||||
| module Rack | ||||||
| module Handler | ||||||
| module Puma | ||||||
| DEFAULT_OPTIONS = { | ||||||
| :Verbose => false, | ||||||
| :Silent => false | ||||||
| } | ||||||
|
|
||||||
| def self.config(app, options = {}) | ||||||
| require_relative '../../puma' | ||||||
| require_relative '../../puma/configuration' | ||||||
| require_relative '../../puma/log_writer' | ||||||
| require_relative '../../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 | ||||||
| # This module is used as an 'include' file in code at bottom of file | ||||||
| module Puma | ||||||
| module RackHandler | ||||||
| DEFAULT_OPTIONS = { | ||||||
| :Verbose => false, | ||||||
| :Silent => false | ||||||
| } | ||||||
|
|
||||||
| def config(app, options = {}) | ||||||
|
||||||
| require_relative '../../puma' | ||||||
| require_relative '../../puma/configuration' | ||||||
| require_relative '../../puma/log_writer' | ||||||
| require_relative '../../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 | ||||||
| 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 | ||||||
| conf | ||||||
| end | ||||||
|
|
||||||
| def self.run(app, **options) | ||||||
| conf = self.config(app, options) | ||||||
| if options[:environment] | ||||||
| user_config.environment options[:environment] | ||||||
| end | ||||||
|
|
||||||
| log_writer = options.delete(:Silent) ? ::Puma::LogWriter.strings : ::Puma::LogWriter.stdio | ||||||
| if options[:Threads] | ||||||
| min, max = options.delete(:Threads).split(':', 2) | ||||||
| user_config.threads min, max | ||||||
| end | ||||||
|
|
||||||
| launcher = ::Puma::Launcher.new(conf, :log_writer => log_writer) | ||||||
| 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 | ||||||
|
|
||||||
| yield launcher if block_given? | ||||||
| begin | ||||||
| launcher.run | ||||||
| rescue Interrupt | ||||||
| puts "* Gracefully stopping, waiting for requests to finish" | ||||||
| launcher.stop | ||||||
| puts "* Goodbye!" | ||||||
| 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 | ||||||
|
|
||||||
| def run(app, **options) | ||||||
| conf = self.config(app, options) | ||||||
|
|
||||||
| log_writer = options.delete(:Silent) ? ::Puma::LogWriter.strings : ::Puma::LogWriter.stdio | ||||||
|
|
||||||
| launcher = ::Puma::Launcher.new(conf, :log_writer => log_writer) | ||||||
|
|
||||||
| 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)" | ||||||
| } | ||||||
| yield launcher if block_given? | ||||||
| begin | ||||||
| launcher.run | ||||||
| rescue Interrupt | ||||||
| puts "* Gracefully stopping, waiting for requests to finish" | ||||||
| launcher.stop | ||||||
| puts "* Goodbye!" | ||||||
| end | ||||||
| end | ||||||
|
|
||||||
| 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::DEFAULTS[:tcp_port] | ||||||
| config.bind uri.to_s | ||||||
| else | ||||||
|
|
||||||
| if host | ||||||
| port ||= ::Puma::Configuration::DEFAULTS[:tcp_port] | ||||||
| end | ||||||
|
|
||||||
| if port | ||||||
| host ||= ::Puma::Configuration::DEFAULTS[:tcp_host] | ||||||
| config.port port, host | ||||||
| end | ||||||
| def 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 | ||||||
|
|
||||||
| def 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::DEFAULTS[:tcp_port] | ||||||
| config.bind uri.to_s | ||||||
| else | ||||||
|
|
||||||
| if host | ||||||
| port ||= ::Puma::Configuration::DEFAULTS[:tcp_port] | ||||||
| end | ||||||
|
|
||||||
| if port | ||||||
| host ||= ::Puma::Configuration::DEFAULTS[:tcp_host] | ||||||
| config.port port, host | ||||||
| end | ||||||
| end | ||||||
| end | ||||||
| end | ||||||
| end | ||||||
|
|
||||||
| register :puma, Puma | ||||||
| # rackup was removed in Rack 3, it is now a separate gem | ||||||
| if Object.const_defined? :Rackup | ||||||
| module Rackup | ||||||
| module Handler | ||||||
| module Puma | ||||||
| class << self | ||||||
| include ::Puma::RackHandler | ||||||
| end | ||||||
| end | ||||||
| register :puma, Puma | ||||||
| end | ||||||
| end | ||||||
| elsif Object.const_defined?(:Rack) && Rack::RELEASE < '3' | ||||||
| module Rack | ||||||
| module Handler | ||||||
| module Puma | ||||||
| class << self | ||||||
| include ::Puma::RackHandler | ||||||
| end | ||||||
| end | ||||||
| register :puma, Puma | ||||||
| end | ||||||
| end | ||||||
| else | ||||||
| raise "You must install the rackup gem when using Rack 3" | ||||||
|
||||||
| raise "You must install the rackup gem when using Rack 3" | |
| raise "You must install the rackup gem when using Rack 3. Run: gem install rackup" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The error message should be more actionable and consistent with the error message in lib/rack/handler/puma.rb. Consider changing to: 'Rack 3 must be used with the rackup gem. Run: gem install rackup'