puma 2.2.0 → 8.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/History.md +3334 -0
- data/LICENSE +23 -20
- data/README.md +387 -100
- data/bin/puma-wild +25 -0
- data/bin/pumactl +1 -1
- data/docs/5.0-Upgrade.md +98 -0
- data/docs/6.0-Upgrade.md +56 -0
- data/docs/7.0-Upgrade.md +52 -0
- data/docs/8.0-Upgrade.md +100 -0
- data/docs/architecture.md +74 -0
- data/docs/compile_options.md +55 -0
- data/docs/deployment.md +137 -0
- data/docs/fork_worker.md +41 -0
- data/docs/grpc.md +62 -0
- data/docs/images/favicon.svg +1 -0
- data/docs/images/puma-connection-flow-no-reactor.png +0 -0
- data/docs/images/puma-connection-flow.png +0 -0
- data/docs/images/puma-general-arch.png +0 -0
- data/docs/images/running-puma.svg +1 -0
- data/docs/images/standard-logo.svg +1 -0
- data/docs/java_options.md +54 -0
- data/docs/jungle/README.md +9 -0
- data/docs/jungle/rc.d/README.md +74 -0
- data/docs/jungle/rc.d/puma +61 -0
- data/docs/jungle/rc.d/puma.conf +10 -0
- data/docs/kubernetes.md +73 -0
- data/docs/nginx.md +5 -5
- data/docs/plugins.md +42 -0
- data/docs/rails_dev_mode.md +28 -0
- data/docs/restart.md +65 -0
- data/docs/signals.md +98 -0
- data/docs/stats.md +148 -0
- data/docs/systemd.md +253 -0
- data/docs/testing_benchmarks_local_files.md +150 -0
- data/docs/testing_test_rackup_ci_files.md +36 -0
- data/ext/puma_http11/PumaHttp11Service.java +2 -2
- data/ext/puma_http11/extconf.rb +59 -2
- data/ext/puma_http11/http11_parser.c +319 -487
- data/ext/puma_http11/http11_parser.h +15 -13
- data/ext/puma_http11/http11_parser.java.rl +64 -94
- data/ext/puma_http11/http11_parser.rl +27 -24
- data/ext/puma_http11/http11_parser_common.rl +8 -8
- data/ext/puma_http11/mini_ssl.c +696 -38
- data/ext/puma_http11/no_ssl/PumaHttp11Service.java +15 -0
- data/ext/puma_http11/org/jruby/puma/EnvKey.java +241 -0
- data/ext/puma_http11/org/jruby/puma/Http11.java +241 -145
- data/ext/puma_http11/org/jruby/puma/Http11Parser.java +174 -221
- data/ext/puma_http11/org/jruby/puma/MiniSSL.java +413 -193
- data/ext/puma_http11/puma_http11.c +183 -175
- data/lib/puma/app/status.rb +77 -29
- data/lib/puma/binder.rb +349 -119
- data/lib/puma/cli.rb +163 -801
- data/lib/puma/client.rb +627 -144
- data/lib/puma/client_env.rb +171 -0
- data/lib/puma/cluster/worker.rb +183 -0
- data/lib/puma/cluster/worker_handle.rb +127 -0
- data/lib/puma/cluster.rb +634 -0
- data/lib/puma/cluster_accept_loop_delay.rb +91 -0
- data/lib/puma/commonlogger.rb +115 -0
- data/lib/puma/configuration.rb +420 -198
- data/lib/puma/const.rb +266 -115
- data/lib/puma/control_cli.rb +219 -120
- data/lib/puma/detect.rb +56 -2
- data/lib/puma/dsl.rb +1562 -0
- data/lib/puma/error_logger.rb +115 -0
- data/lib/puma/events.rb +44 -60
- data/lib/puma/io_buffer.rb +48 -5
- data/lib/puma/jruby_restart.rb +2 -51
- data/lib/puma/json_serialization.rb +96 -0
- data/lib/puma/launcher/bundle_pruner.rb +102 -0
- data/lib/puma/launcher.rb +501 -0
- data/lib/puma/log_writer.rb +153 -0
- data/lib/puma/minissl/context_builder.rb +96 -0
- data/lib/puma/minissl.rb +355 -37
- data/lib/puma/null_io.rb +79 -12
- data/lib/puma/plugin/systemd.rb +90 -0
- data/lib/puma/plugin/tmp_restart.rb +36 -0
- data/lib/puma/plugin.rb +111 -0
- data/lib/puma/rack/builder.rb +297 -0
- data/lib/puma/rack/urlmap.rb +93 -0
- data/lib/puma/rack_default.rb +21 -4
- data/lib/puma/reactor.rb +102 -133
- data/lib/puma/response.rb +532 -0
- data/lib/puma/runner.rb +211 -0
- data/lib/puma/sd_notify.rb +146 -0
- data/lib/puma/server.rb +582 -445
- data/lib/puma/server_plugin_control.rb +32 -0
- data/lib/puma/single.rb +72 -0
- data/lib/puma/state_file.rb +69 -0
- data/lib/puma/thread_pool.rb +389 -57
- data/lib/puma/util.rb +125 -0
- data/lib/puma.rb +80 -6
- data/lib/rack/handler/puma.rb +125 -47
- data/tools/Dockerfile +26 -0
- data/tools/trickletest.rb +44 -0
- metadata +88 -148
- data/COPYING +0 -55
- data/Gemfile +0 -10
- data/History.txt +0 -302
- data/Manifest.txt +0 -60
- data/Rakefile +0 -165
- data/TODO +0 -5
- data/docs/config.md +0 -0
- data/ext/puma_http11/ext_help.h +0 -15
- data/ext/puma_http11/io_buffer.c +0 -154
- data/lib/puma/accept_nonblock.rb +0 -23
- data/lib/puma/capistrano.rb +0 -34
- data/lib/puma/compat.rb +0 -11
- data/lib/puma/daemon_ext.rb +0 -20
- data/lib/puma/delegation.rb +0 -11
- data/lib/puma/java_io_buffer.rb +0 -45
- data/lib/puma/rack_patch.rb +0 -25
- data/puma.gemspec +0 -45
- data/test/test_app_status.rb +0 -88
- data/test/test_cli.rb +0 -171
- data/test/test_config.rb +0 -16
- data/test/test_http10.rb +0 -27
- data/test/test_http11.rb +0 -126
- data/test/test_integration.rb +0 -154
- data/test/test_iobuffer.rb +0 -38
- data/test/test_minissl.rb +0 -25
- data/test/test_null_io.rb +0 -31
- data/test/test_persistent.rb +0 -238
- data/test/test_puma_server.rb +0 -224
- data/test/test_rack_handler.rb +0 -10
- data/test/test_rack_server.rb +0 -141
- data/test/test_thread_pool.rb +0 -146
- data/test/test_unix_socket.rb +0 -39
- data/test/test_ws.rb +0 -89
- data/tools/jungle/init.d/README.md +0 -54
- data/tools/jungle/init.d/puma +0 -332
- data/tools/jungle/init.d/run-puma +0 -3
- data/tools/jungle/upstart/README.md +0 -61
- data/tools/jungle/upstart/puma-manager.conf +0 -31
- data/tools/jungle/upstart/puma.conf +0 -52
data/lib/puma.rb
CHANGED
|
@@ -1,14 +1,88 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
# Standard libraries
|
|
2
4
|
require 'socket'
|
|
3
5
|
require 'tempfile'
|
|
4
|
-
require 'yaml'
|
|
5
|
-
require 'time'
|
|
6
|
-
require 'etc'
|
|
7
6
|
require 'uri'
|
|
8
7
|
require 'stringio'
|
|
9
8
|
|
|
10
9
|
require 'thread'
|
|
11
10
|
|
|
12
|
-
#
|
|
13
|
-
require 'puma/
|
|
14
|
-
|
|
11
|
+
# use require, see https://github.com/puma/puma/pull/2381
|
|
12
|
+
require 'puma/puma_http11'
|
|
13
|
+
|
|
14
|
+
require_relative 'puma/detect'
|
|
15
|
+
require_relative 'puma/json_serialization'
|
|
16
|
+
|
|
17
|
+
module Puma
|
|
18
|
+
# when Puma is loaded via `Puma::CLI`, all files are loaded via
|
|
19
|
+
# `require_relative`. The below are for non-standard loading
|
|
20
|
+
autoload :Const, "#{__dir__}/puma/const"
|
|
21
|
+
autoload :Server, "#{__dir__}/puma/server"
|
|
22
|
+
autoload :Launcher, "#{__dir__}/puma/launcher"
|
|
23
|
+
autoload :LogWriter, "#{__dir__}/puma/log_writer"
|
|
24
|
+
|
|
25
|
+
# at present, MiniSSL::Engine is only defined in extension code (puma_http11),
|
|
26
|
+
# not in minissl.rb
|
|
27
|
+
HAS_SSL = const_defined?(:MiniSSL, false) && MiniSSL.const_defined?(:Engine, false)
|
|
28
|
+
|
|
29
|
+
HAS_UNIX_SOCKET = Object.const_defined?(:UNIXSocket) && !IS_WINDOWS
|
|
30
|
+
|
|
31
|
+
if HAS_SSL
|
|
32
|
+
require_relative 'puma/minissl'
|
|
33
|
+
else
|
|
34
|
+
module MiniSSL
|
|
35
|
+
# this class is defined so that it exists when Puma is compiled
|
|
36
|
+
# without ssl support, as Server and Reactor use it in rescue statements.
|
|
37
|
+
class SSLError < StandardError ; end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def self.ssl?
|
|
42
|
+
HAS_SSL
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def self.abstract_unix_socket?
|
|
46
|
+
@abstract_unix ||=
|
|
47
|
+
if HAS_UNIX_SOCKET
|
|
48
|
+
begin
|
|
49
|
+
::UNIXServer.new("\0puma.temp.unix").close
|
|
50
|
+
true
|
|
51
|
+
rescue ArgumentError # darwin
|
|
52
|
+
false
|
|
53
|
+
end
|
|
54
|
+
else
|
|
55
|
+
false
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# @!attribute [rw] stats_object=
|
|
60
|
+
def self.stats_object=(val)
|
|
61
|
+
@get_stats = val
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# @!attribute [rw] stats_object
|
|
65
|
+
def self.stats
|
|
66
|
+
Puma::JSONSerialization.generate @get_stats.stats
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# @!attribute [r] stats_hash
|
|
70
|
+
# @version 5.0.0
|
|
71
|
+
def self.stats_hash
|
|
72
|
+
@get_stats.stats
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def self.set_thread_name(name)
|
|
76
|
+
Thread.current.name = "puma #{name}"
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Shows deprecated warning for renamed methods.
|
|
80
|
+
# @example
|
|
81
|
+
# Puma.deprecate_method_change :on_booted, __callee__, __method__
|
|
82
|
+
#
|
|
83
|
+
def self.deprecate_method_change(method_old, method_caller, method_new)
|
|
84
|
+
if method_old == method_caller
|
|
85
|
+
warn "Use '#{method_new}', '#{method_caller}' is deprecated and will be removed in v8"
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
data/lib/rack/handler/puma.rb
CHANGED
|
@@ -1,66 +1,144 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
module
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Puma
|
|
4
|
+
|
|
5
|
+
# This module is used as an 'include' file in code at bottom of file. It loads
|
|
6
|
+
# into either `Rackup::Handler::Puma` or `Rack::Handler::Puma`.
|
|
7
|
+
|
|
8
|
+
module RackHandler
|
|
9
|
+
DEFAULT_OPTIONS = {
|
|
10
|
+
:Verbose => false,
|
|
11
|
+
:Silent => false
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
def config(app, options = {})
|
|
15
|
+
require_relative '../../puma'
|
|
16
|
+
require_relative '../../puma/configuration'
|
|
17
|
+
require_relative '../../puma/log_writer'
|
|
18
|
+
require_relative '../../puma/launcher'
|
|
19
|
+
|
|
20
|
+
default_options = DEFAULT_OPTIONS.dup
|
|
21
|
+
|
|
22
|
+
# Libraries pass in values such as :Port and there is no way to determine
|
|
23
|
+
# if it is a default provided by the library or a special value provided
|
|
24
|
+
# by the user. A special key `user_supplied_options` can be passed. This
|
|
25
|
+
# contains an array of all explicitly defined user options. We then
|
|
26
|
+
# know that all other values are defaults
|
|
27
|
+
if user_supplied_options = options.delete(:user_supplied_options)
|
|
28
|
+
(options.keys - user_supplied_options).each do |k|
|
|
29
|
+
default_options[k] = options.delete(k)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
13
32
|
|
|
14
|
-
|
|
15
|
-
options = DEFAULT_OPTIONS.merge(options)
|
|
33
|
+
@events = options[:events] || ::Puma::Events.new
|
|
16
34
|
|
|
17
|
-
|
|
18
|
-
|
|
35
|
+
conf = ::Puma::Configuration.new(options, default_options.merge({ events: @events })) do |user_config, file_config, default_config|
|
|
36
|
+
if options.delete(:Verbose)
|
|
37
|
+
begin
|
|
38
|
+
require 'rack/commonlogger' # Rack 1.x
|
|
39
|
+
rescue LoadError
|
|
40
|
+
require 'rack/common_logger' # Rack 2 and later
|
|
41
|
+
end
|
|
42
|
+
app = ::Rack::CommonLogger.new(app, STDOUT)
|
|
19
43
|
end
|
|
20
44
|
|
|
21
45
|
if options[:environment]
|
|
22
|
-
|
|
46
|
+
user_config.environment options[:environment]
|
|
23
47
|
end
|
|
24
48
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
puts "Puma #{::Puma::Const::PUMA_VERSION} starting..."
|
|
29
|
-
puts "* Min threads: #{min}, max threads: #{max}"
|
|
30
|
-
puts "* Environment: #{ENV['RACK_ENV']}"
|
|
31
|
-
puts "* Listening on tcp://#{options[:Host]}:#{options[:Port]}"
|
|
32
|
-
|
|
33
|
-
server.add_tcp_listener options[:Host], options[:Port]
|
|
34
|
-
server.min_threads = Integer(min)
|
|
35
|
-
server.max_threads = Integer(max)
|
|
36
|
-
yield server if block_given?
|
|
37
|
-
|
|
38
|
-
begin
|
|
39
|
-
server.run.join
|
|
40
|
-
rescue Interrupt
|
|
41
|
-
puts "* Gracefully stopping, waiting for requests to finish"
|
|
42
|
-
server.stop(true)
|
|
43
|
-
puts "* Goodbye!"
|
|
49
|
+
if options[:Threads]
|
|
50
|
+
min, max = options.delete(:Threads).split(':', 2)
|
|
51
|
+
user_config.threads min, max
|
|
44
52
|
end
|
|
45
53
|
|
|
54
|
+
if options[:Host] || options[:Port]
|
|
55
|
+
host = options[:Host] || default_options[:Host]
|
|
56
|
+
port = options[:Port] || default_options[:Port]
|
|
57
|
+
self.set_host_port_to_config(host, port, user_config)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
if default_options[:Host]
|
|
61
|
+
file_config.set_default_host(default_options[:Host])
|
|
62
|
+
end
|
|
63
|
+
self.set_host_port_to_config(default_options[:Host], default_options[:Port], default_config)
|
|
64
|
+
|
|
65
|
+
user_config.app app
|
|
46
66
|
end
|
|
67
|
+
conf
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def run(app, **options)
|
|
71
|
+
conf = self.config(app, options)
|
|
72
|
+
|
|
73
|
+
log_writer = options.delete(:Silent) ? ::Puma::LogWriter.strings : ::Puma::LogWriter.stdio
|
|
74
|
+
|
|
75
|
+
launcher = ::Puma::Launcher.new(conf, log_writer: log_writer, events: @events)
|
|
47
76
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
77
|
+
yield launcher if block_given?
|
|
78
|
+
begin
|
|
79
|
+
launcher.run
|
|
80
|
+
rescue Interrupt
|
|
81
|
+
puts "* Gracefully stopping, waiting for requests to finish"
|
|
82
|
+
launcher.stop
|
|
83
|
+
puts "* Goodbye!"
|
|
55
84
|
end
|
|
56
85
|
end
|
|
57
86
|
|
|
58
|
-
|
|
87
|
+
def valid_options
|
|
88
|
+
{
|
|
89
|
+
"Host=HOST" => "Hostname to listen on (default: localhost)",
|
|
90
|
+
"Port=PORT" => "Port to listen on (default: 8080)",
|
|
91
|
+
"Threads=MIN:MAX" => "min:max threads to use (default 0:16)",
|
|
92
|
+
"Verbose" => "Don't report each request (default: false)"
|
|
93
|
+
}
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def set_host_port_to_config(host, port, config)
|
|
97
|
+
config.clear_binds! if host || port
|
|
98
|
+
|
|
99
|
+
if host&.start_with? '.', '/', '@'
|
|
100
|
+
config.bind "unix://#{host}"
|
|
101
|
+
elsif host&.start_with? 'ssl://'
|
|
102
|
+
uri = URI.parse(host)
|
|
103
|
+
uri.port ||= port || ::Puma::Configuration::DEFAULTS[:tcp_port]
|
|
104
|
+
config.bind uri.to_s
|
|
105
|
+
else
|
|
106
|
+
|
|
107
|
+
if host
|
|
108
|
+
port ||= ::Puma::Configuration::DEFAULTS[:tcp_port]
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
if port
|
|
112
|
+
host ||= ::Puma::Configuration.default_tcp_host
|
|
113
|
+
config.port port, host
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
59
117
|
end
|
|
60
118
|
end
|
|
61
119
|
|
|
62
|
-
#
|
|
63
|
-
|
|
64
|
-
|
|
120
|
+
# rackup was removed in Rack 3, it is now a separate gem
|
|
121
|
+
if Object.const_defined?(:Rackup) && ::Rackup.const_defined?(:Handler)
|
|
122
|
+
module Rackup
|
|
123
|
+
module Handler
|
|
124
|
+
module Puma
|
|
125
|
+
class << self
|
|
126
|
+
include ::Puma::RackHandler
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
register :puma, Puma
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
else
|
|
133
|
+
do_register = Object.const_defined?(:Rack) && ::Rack.release < '3'
|
|
134
|
+
module Rack
|
|
135
|
+
module Handler
|
|
136
|
+
module Puma
|
|
137
|
+
class << self
|
|
138
|
+
include ::Puma::RackHandler
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
65
142
|
end
|
|
143
|
+
::Rack::Handler.register(:puma, ::Rack::Handler::Puma) if do_register
|
|
66
144
|
end
|
data/tools/Dockerfile
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Use this Dockerfile to create minimal reproductions of issues
|
|
2
|
+
# Build (MRI): docker build -f tools/Dockerfile .
|
|
3
|
+
# Build (JRuby): docker build -f tools/Dockerfile --build-arg RUBY_IMAGE=jruby:9.4 .
|
|
4
|
+
|
|
5
|
+
ARG RUBY_IMAGE=ruby:latest
|
|
6
|
+
FROM ${RUBY_IMAGE}
|
|
7
|
+
|
|
8
|
+
# Set BUNDLE_FROZEN=false if you need to update Gemfile.lock during a build.
|
|
9
|
+
ARG BUNDLE_FROZEN=true
|
|
10
|
+
|
|
11
|
+
RUN apt-get update \
|
|
12
|
+
&& apt-get install -y --no-install-recommends ragel procps git \
|
|
13
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
14
|
+
|
|
15
|
+
# Only freeze Bundler and compile native extensions when using MRI.
|
|
16
|
+
RUN if [ "$(ruby -e 'print RUBY_ENGINE')" = "ruby" ] && [ "${BUNDLE_FROZEN}" = "true" ]; then bundle config --global frozen 1; fi
|
|
17
|
+
|
|
18
|
+
WORKDIR /usr/src/app
|
|
19
|
+
|
|
20
|
+
COPY . .
|
|
21
|
+
|
|
22
|
+
RUN bundle install
|
|
23
|
+
RUN if [ "$(ruby -e 'print RUBY_ENGINE')" = "ruby" ]; then bundle exec rake compile; fi
|
|
24
|
+
|
|
25
|
+
EXPOSE 9292
|
|
26
|
+
CMD ["bundle", "exec", "bin/puma", "test/rackup/hello.ru"]
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
require 'socket'
|
|
2
|
+
require 'stringio'
|
|
3
|
+
|
|
4
|
+
def do_test(st, chunk)
|
|
5
|
+
s = TCPSocket.new('127.0.0.1',ARGV[0].to_i);
|
|
6
|
+
req = StringIO.new(st)
|
|
7
|
+
nout = 0
|
|
8
|
+
randstop = rand(st.length / 10)
|
|
9
|
+
STDERR.puts "stopping after: #{randstop}"
|
|
10
|
+
|
|
11
|
+
begin
|
|
12
|
+
while data = req.read(chunk)
|
|
13
|
+
nout += s.write(data)
|
|
14
|
+
s.flush
|
|
15
|
+
sleep 0.1
|
|
16
|
+
if nout > randstop
|
|
17
|
+
STDERR.puts "BANG! after #{nout} bytes."
|
|
18
|
+
break
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
rescue Object => e
|
|
22
|
+
STDERR.puts "ERROR: #{e}"
|
|
23
|
+
ensure
|
|
24
|
+
s.close
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
content = "-" * (1024 * 240)
|
|
29
|
+
st = "GET / HTTP/1.1\r\nHost: www.zedshaw.com\r\nContent-Type: text/plain\r\nContent-Length: #{content.length}\r\n\r\n#{content}"
|
|
30
|
+
|
|
31
|
+
puts "length: #{content.length}"
|
|
32
|
+
|
|
33
|
+
threads = []
|
|
34
|
+
ARGV[1].to_i.times do
|
|
35
|
+
t = Thread.new do
|
|
36
|
+
size = 100
|
|
37
|
+
puts ">>>> #{size} sized chunks"
|
|
38
|
+
do_test(st, size)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
threads << t
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
threads.each {|t| t.join}
|
metadata
CHANGED
|
@@ -1,90 +1,33 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: puma
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
5
|
-
prerelease:
|
|
4
|
+
version: 8.0.2
|
|
6
5
|
platform: ruby
|
|
7
6
|
authors:
|
|
8
7
|
- Evan Phoenix
|
|
9
|
-
autorequire:
|
|
10
8
|
bindir: bin
|
|
11
9
|
cert_chain: []
|
|
12
|
-
date:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
13
11
|
dependencies:
|
|
14
12
|
- !ruby/object:Gem::Dependency
|
|
15
|
-
name:
|
|
13
|
+
name: nio4r
|
|
16
14
|
requirement: !ruby/object:Gem::Requirement
|
|
17
|
-
none: false
|
|
18
15
|
requirements:
|
|
19
|
-
- -
|
|
20
|
-
- !ruby/object:Gem::Version
|
|
21
|
-
version: '1.1'
|
|
22
|
-
- - <
|
|
16
|
+
- - "~>"
|
|
23
17
|
- !ruby/object:Gem::Version
|
|
24
18
|
version: '2.0'
|
|
25
19
|
type: :runtime
|
|
26
20
|
prerelease: false
|
|
27
21
|
version_requirements: !ruby/object:Gem::Requirement
|
|
28
|
-
none: false
|
|
29
22
|
requirements:
|
|
30
|
-
- -
|
|
31
|
-
- !ruby/object:Gem::Version
|
|
32
|
-
version: '1.1'
|
|
33
|
-
- - <
|
|
23
|
+
- - "~>"
|
|
34
24
|
- !ruby/object:Gem::Version
|
|
35
25
|
version: '2.0'
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
- - ~>
|
|
42
|
-
- !ruby/object:Gem::Version
|
|
43
|
-
version: '4.0'
|
|
44
|
-
type: :development
|
|
45
|
-
prerelease: false
|
|
46
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
47
|
-
none: false
|
|
48
|
-
requirements:
|
|
49
|
-
- - ~>
|
|
50
|
-
- !ruby/object:Gem::Version
|
|
51
|
-
version: '4.0'
|
|
52
|
-
- !ruby/object:Gem::Dependency
|
|
53
|
-
name: rake-compiler
|
|
54
|
-
requirement: !ruby/object:Gem::Requirement
|
|
55
|
-
none: false
|
|
56
|
-
requirements:
|
|
57
|
-
- - ~>
|
|
58
|
-
- !ruby/object:Gem::Version
|
|
59
|
-
version: 0.8.0
|
|
60
|
-
type: :development
|
|
61
|
-
prerelease: false
|
|
62
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
63
|
-
none: false
|
|
64
|
-
requirements:
|
|
65
|
-
- - ~>
|
|
66
|
-
- !ruby/object:Gem::Version
|
|
67
|
-
version: 0.8.0
|
|
68
|
-
- !ruby/object:Gem::Dependency
|
|
69
|
-
name: hoe
|
|
70
|
-
requirement: !ruby/object:Gem::Requirement
|
|
71
|
-
none: false
|
|
72
|
-
requirements:
|
|
73
|
-
- - ~>
|
|
74
|
-
- !ruby/object:Gem::Version
|
|
75
|
-
version: '3.6'
|
|
76
|
-
type: :development
|
|
77
|
-
prerelease: false
|
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
-
none: false
|
|
80
|
-
requirements:
|
|
81
|
-
- - ~>
|
|
82
|
-
- !ruby/object:Gem::Version
|
|
83
|
-
version: '3.6'
|
|
84
|
-
description: Puma is a simple, fast, threaded, and highly concurrent HTTP 1.1 server
|
|
85
|
-
for Ruby/Rack applications. Puma is intended for use in both development and production
|
|
86
|
-
environments. In order to get the best throughput, it is highly recommended that
|
|
87
|
-
you use a Ruby implementation with real threads like Rubinius or JRuby.
|
|
26
|
+
description: |
|
|
27
|
+
Puma is a simple, fast, multi-threaded, and highly parallel HTTP 1.1 server
|
|
28
|
+
for Ruby/Rack applications. Puma is intended for use in both development and
|
|
29
|
+
production environments. It's great for highly parallel Ruby implementations such as
|
|
30
|
+
JRuby and TruffleRuby as well as as providing process worker support to support CRuby well.
|
|
88
31
|
email:
|
|
89
32
|
- evan@phx.io
|
|
90
33
|
executables:
|
|
@@ -92,132 +35,129 @@ executables:
|
|
|
92
35
|
- pumactl
|
|
93
36
|
extensions:
|
|
94
37
|
- ext/puma_http11/extconf.rb
|
|
95
|
-
extra_rdoc_files:
|
|
96
|
-
- History.txt
|
|
97
|
-
- Manifest.txt
|
|
98
|
-
- README.md
|
|
99
|
-
- docs/config.md
|
|
100
|
-
- docs/nginx.md
|
|
101
|
-
- tools/jungle/init.d/README.md
|
|
102
|
-
- tools/jungle/upstart/README.md
|
|
38
|
+
extra_rdoc_files: []
|
|
103
39
|
files:
|
|
104
|
-
-
|
|
105
|
-
- Gemfile
|
|
106
|
-
- History.txt
|
|
40
|
+
- History.md
|
|
107
41
|
- LICENSE
|
|
108
|
-
- Manifest.txt
|
|
109
42
|
- README.md
|
|
110
|
-
- Rakefile
|
|
111
|
-
- TODO
|
|
112
43
|
- bin/puma
|
|
44
|
+
- bin/puma-wild
|
|
113
45
|
- bin/pumactl
|
|
114
|
-
- docs/
|
|
46
|
+
- docs/5.0-Upgrade.md
|
|
47
|
+
- docs/6.0-Upgrade.md
|
|
48
|
+
- docs/7.0-Upgrade.md
|
|
49
|
+
- docs/8.0-Upgrade.md
|
|
50
|
+
- docs/architecture.md
|
|
51
|
+
- docs/compile_options.md
|
|
52
|
+
- docs/deployment.md
|
|
53
|
+
- docs/fork_worker.md
|
|
54
|
+
- docs/grpc.md
|
|
55
|
+
- docs/images/favicon.svg
|
|
56
|
+
- docs/images/puma-connection-flow-no-reactor.png
|
|
57
|
+
- docs/images/puma-connection-flow.png
|
|
58
|
+
- docs/images/puma-general-arch.png
|
|
59
|
+
- docs/images/running-puma.svg
|
|
60
|
+
- docs/images/standard-logo.svg
|
|
61
|
+
- docs/java_options.md
|
|
62
|
+
- docs/jungle/README.md
|
|
63
|
+
- docs/jungle/rc.d/README.md
|
|
64
|
+
- docs/jungle/rc.d/puma
|
|
65
|
+
- docs/jungle/rc.d/puma.conf
|
|
66
|
+
- docs/kubernetes.md
|
|
115
67
|
- docs/nginx.md
|
|
68
|
+
- docs/plugins.md
|
|
69
|
+
- docs/rails_dev_mode.md
|
|
70
|
+
- docs/restart.md
|
|
71
|
+
- docs/signals.md
|
|
72
|
+
- docs/stats.md
|
|
73
|
+
- docs/systemd.md
|
|
74
|
+
- docs/testing_benchmarks_local_files.md
|
|
75
|
+
- docs/testing_test_rackup_ci_files.md
|
|
116
76
|
- ext/puma_http11/PumaHttp11Service.java
|
|
117
|
-
- ext/puma_http11/ext_help.h
|
|
118
77
|
- ext/puma_http11/extconf.rb
|
|
119
78
|
- ext/puma_http11/http11_parser.c
|
|
120
79
|
- ext/puma_http11/http11_parser.h
|
|
121
80
|
- ext/puma_http11/http11_parser.java.rl
|
|
122
81
|
- ext/puma_http11/http11_parser.rl
|
|
123
82
|
- ext/puma_http11/http11_parser_common.rl
|
|
124
|
-
- ext/puma_http11/io_buffer.c
|
|
125
83
|
- ext/puma_http11/mini_ssl.c
|
|
84
|
+
- ext/puma_http11/no_ssl/PumaHttp11Service.java
|
|
85
|
+
- ext/puma_http11/org/jruby/puma/EnvKey.java
|
|
126
86
|
- ext/puma_http11/org/jruby/puma/Http11.java
|
|
127
87
|
- ext/puma_http11/org/jruby/puma/Http11Parser.java
|
|
128
88
|
- ext/puma_http11/org/jruby/puma/MiniSSL.java
|
|
129
89
|
- ext/puma_http11/puma_http11.c
|
|
130
90
|
- lib/puma.rb
|
|
131
|
-
- lib/puma/accept_nonblock.rb
|
|
132
91
|
- lib/puma/app/status.rb
|
|
133
92
|
- lib/puma/binder.rb
|
|
134
|
-
- lib/puma/capistrano.rb
|
|
135
93
|
- lib/puma/cli.rb
|
|
136
94
|
- lib/puma/client.rb
|
|
137
|
-
- lib/puma/
|
|
95
|
+
- lib/puma/client_env.rb
|
|
96
|
+
- lib/puma/cluster.rb
|
|
97
|
+
- lib/puma/cluster/worker.rb
|
|
98
|
+
- lib/puma/cluster/worker_handle.rb
|
|
99
|
+
- lib/puma/cluster_accept_loop_delay.rb
|
|
100
|
+
- lib/puma/commonlogger.rb
|
|
138
101
|
- lib/puma/configuration.rb
|
|
139
102
|
- lib/puma/const.rb
|
|
140
103
|
- lib/puma/control_cli.rb
|
|
141
|
-
- lib/puma/daemon_ext.rb
|
|
142
|
-
- lib/puma/delegation.rb
|
|
143
104
|
- lib/puma/detect.rb
|
|
105
|
+
- lib/puma/dsl.rb
|
|
106
|
+
- lib/puma/error_logger.rb
|
|
144
107
|
- lib/puma/events.rb
|
|
145
108
|
- lib/puma/io_buffer.rb
|
|
146
|
-
- lib/puma/java_io_buffer.rb
|
|
147
109
|
- lib/puma/jruby_restart.rb
|
|
110
|
+
- lib/puma/json_serialization.rb
|
|
111
|
+
- lib/puma/launcher.rb
|
|
112
|
+
- lib/puma/launcher/bundle_pruner.rb
|
|
113
|
+
- lib/puma/log_writer.rb
|
|
148
114
|
- lib/puma/minissl.rb
|
|
115
|
+
- lib/puma/minissl/context_builder.rb
|
|
149
116
|
- lib/puma/null_io.rb
|
|
117
|
+
- lib/puma/plugin.rb
|
|
118
|
+
- lib/puma/plugin/systemd.rb
|
|
119
|
+
- lib/puma/plugin/tmp_restart.rb
|
|
120
|
+
- lib/puma/rack/builder.rb
|
|
121
|
+
- lib/puma/rack/urlmap.rb
|
|
150
122
|
- lib/puma/rack_default.rb
|
|
151
|
-
- lib/puma/rack_patch.rb
|
|
152
123
|
- lib/puma/reactor.rb
|
|
124
|
+
- lib/puma/response.rb
|
|
125
|
+
- lib/puma/runner.rb
|
|
126
|
+
- lib/puma/sd_notify.rb
|
|
153
127
|
- lib/puma/server.rb
|
|
128
|
+
- lib/puma/server_plugin_control.rb
|
|
129
|
+
- lib/puma/single.rb
|
|
130
|
+
- lib/puma/state_file.rb
|
|
154
131
|
- lib/puma/thread_pool.rb
|
|
155
132
|
- lib/puma/util.rb
|
|
156
133
|
- lib/rack/handler/puma.rb
|
|
157
|
-
-
|
|
158
|
-
- tools/
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
- test/test_iobuffer.rb
|
|
171
|
-
- test/test_minissl.rb
|
|
172
|
-
- test/test_null_io.rb
|
|
173
|
-
- test/test_persistent.rb
|
|
174
|
-
- test/test_puma_server.rb
|
|
175
|
-
- test/test_rack_handler.rb
|
|
176
|
-
- test/test_rack_server.rb
|
|
177
|
-
- test/test_thread_pool.rb
|
|
178
|
-
- test/test_unix_socket.rb
|
|
179
|
-
- test/test_ws.rb
|
|
180
|
-
homepage: http://puma.io
|
|
181
|
-
licenses: []
|
|
182
|
-
post_install_message:
|
|
183
|
-
rdoc_options:
|
|
184
|
-
- --main
|
|
185
|
-
- README.md
|
|
134
|
+
- tools/Dockerfile
|
|
135
|
+
- tools/trickletest.rb
|
|
136
|
+
homepage: https://puma.io
|
|
137
|
+
licenses:
|
|
138
|
+
- BSD-3-Clause
|
|
139
|
+
metadata:
|
|
140
|
+
bug_tracker_uri: https://github.com/puma/puma/issues
|
|
141
|
+
changelog_uri: https://github.com/puma/puma/blob/main/History.md
|
|
142
|
+
homepage_uri: https://puma.io
|
|
143
|
+
source_code_uri: https://github.com/puma/puma
|
|
144
|
+
rubygems_mfa_required: 'true'
|
|
145
|
+
msys2_mingw_dependencies: openssl
|
|
146
|
+
rdoc_options: []
|
|
186
147
|
require_paths:
|
|
187
148
|
- lib
|
|
188
149
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
189
|
-
none: false
|
|
190
150
|
requirements:
|
|
191
|
-
- -
|
|
151
|
+
- - ">="
|
|
192
152
|
- !ruby/object:Gem::Version
|
|
193
|
-
version:
|
|
153
|
+
version: '3.0'
|
|
194
154
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
195
|
-
none: false
|
|
196
155
|
requirements:
|
|
197
|
-
- -
|
|
156
|
+
- - ">="
|
|
198
157
|
- !ruby/object:Gem::Version
|
|
199
158
|
version: '0'
|
|
200
159
|
requirements: []
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
summary: Puma is a simple, fast, threaded, and highly concurrent HTTP 1.1 server for
|
|
206
|
-
Ruby/Rack applications
|
|
207
|
-
test_files:
|
|
208
|
-
- test/test_app_status.rb
|
|
209
|
-
- test/test_cli.rb
|
|
210
|
-
- test/test_config.rb
|
|
211
|
-
- test/test_http10.rb
|
|
212
|
-
- test/test_http11.rb
|
|
213
|
-
- test/test_integration.rb
|
|
214
|
-
- test/test_iobuffer.rb
|
|
215
|
-
- test/test_minissl.rb
|
|
216
|
-
- test/test_null_io.rb
|
|
217
|
-
- test/test_persistent.rb
|
|
218
|
-
- test/test_puma_server.rb
|
|
219
|
-
- test/test_rack_handler.rb
|
|
220
|
-
- test/test_rack_server.rb
|
|
221
|
-
- test/test_thread_pool.rb
|
|
222
|
-
- test/test_unix_socket.rb
|
|
223
|
-
- test/test_ws.rb
|
|
160
|
+
rubygems_version: 4.0.6
|
|
161
|
+
specification_version: 4
|
|
162
|
+
summary: A Ruby/Rack web server built for parallelism.
|
|
163
|
+
test_files: []
|