puma 3.11.4 → 6.0.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of puma might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/History.md +1717 -432
- data/LICENSE +23 -20
- data/README.md +190 -64
- data/bin/puma-wild +3 -9
- data/docs/architecture.md +59 -21
- data/docs/compile_options.md +55 -0
- data/docs/deployment.md +69 -58
- data/docs/fork_worker.md +31 -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/jungle/README.md +9 -0
- data/{tools → docs}/jungle/rc.d/README.md +1 -1
- data/{tools → docs}/jungle/rc.d/puma +2 -2
- data/{tools → docs}/jungle/rc.d/puma.conf +0 -0
- data/docs/kubernetes.md +66 -0
- data/docs/nginx.md +2 -2
- data/docs/plugins.md +22 -12
- data/docs/rails_dev_mode.md +28 -0
- data/docs/restart.md +47 -22
- data/docs/signals.md +13 -11
- data/docs/stats.md +142 -0
- data/docs/systemd.md +95 -120
- 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/ext_help.h +1 -1
- data/ext/puma_http11/extconf.rb +61 -3
- data/ext/puma_http11/http11_parser.c +106 -118
- data/ext/puma_http11/http11_parser.h +2 -2
- data/ext/puma_http11/http11_parser.java.rl +22 -38
- data/ext/puma_http11/http11_parser.rl +6 -4
- data/ext/puma_http11/http11_parser_common.rl +6 -6
- data/ext/puma_http11/mini_ssl.c +376 -93
- data/ext/puma_http11/no_ssl/PumaHttp11Service.java +15 -0
- data/ext/puma_http11/org/jruby/puma/Http11.java +108 -116
- data/ext/puma_http11/org/jruby/puma/Http11Parser.java +84 -99
- data/ext/puma_http11/org/jruby/puma/MiniSSL.java +250 -88
- data/ext/puma_http11/puma_http11.c +49 -57
- data/lib/puma/app/status.rb +71 -49
- data/lib/puma/binder.rb +243 -148
- data/lib/puma/cli.rb +50 -36
- data/lib/puma/client.rb +373 -233
- data/lib/puma/cluster/worker.rb +175 -0
- data/lib/puma/cluster/worker_handle.rb +97 -0
- data/lib/puma/cluster.rb +268 -235
- data/lib/puma/commonlogger.rb +4 -2
- data/lib/puma/configuration.rb +116 -88
- data/lib/puma/const.rb +49 -30
- data/lib/puma/control_cli.rb +123 -76
- data/lib/puma/detect.rb +33 -2
- data/lib/puma/dsl.rb +685 -135
- data/lib/puma/error_logger.rb +112 -0
- data/lib/puma/events.rb +17 -111
- data/lib/puma/io_buffer.rb +44 -5
- data/lib/puma/jruby_restart.rb +4 -59
- data/lib/puma/json_serialization.rb +96 -0
- data/lib/puma/launcher/bundle_pruner.rb +104 -0
- data/lib/puma/launcher.rb +196 -130
- data/lib/puma/log_writer.rb +137 -0
- data/lib/puma/minissl/context_builder.rb +92 -0
- data/lib/puma/minissl.rb +249 -69
- data/lib/puma/null_io.rb +20 -1
- data/lib/puma/plugin/tmp_restart.rb +3 -1
- data/lib/puma/plugin.rb +9 -13
- data/lib/puma/rack/builder.rb +8 -9
- data/lib/puma/rack/urlmap.rb +2 -0
- data/lib/puma/rack_default.rb +3 -1
- data/lib/puma/reactor.rb +90 -187
- data/lib/puma/request.rb +644 -0
- data/lib/puma/runner.rb +94 -71
- data/lib/puma/server.rb +337 -715
- data/lib/puma/single.rb +27 -72
- data/lib/puma/state_file.rb +46 -7
- data/lib/puma/systemd.rb +47 -0
- data/lib/puma/thread_pool.rb +184 -93
- data/lib/puma/util.rb +23 -10
- data/lib/puma.rb +60 -3
- data/lib/rack/handler/puma.rb +17 -15
- data/tools/Dockerfile +16 -0
- data/tools/trickletest.rb +0 -1
- metadata +53 -33
- data/ext/puma_http11/io_buffer.c +0 -155
- data/lib/puma/accept_nonblock.rb +0 -23
- data/lib/puma/compat.rb +0 -14
- data/lib/puma/convenient.rb +0 -23
- data/lib/puma/daemon_ext.rb +0 -31
- data/lib/puma/delegation.rb +0 -11
- data/lib/puma/java_io_buffer.rb +0 -45
- data/lib/puma/rack/backports/uri/common_193.rb +0 -33
- data/lib/puma/tcp_logger.rb +0 -39
- data/tools/jungle/README.md +0 -19
- data/tools/jungle/init.d/README.md +0 -61
- data/tools/jungle/init.d/puma +0 -421
- data/tools/jungle/init.d/run-puma +0 -18
- data/tools/jungle/upstart/README.md +0 -61
- data/tools/jungle/upstart/puma-manager.conf +0 -31
- data/tools/jungle/upstart/puma.conf +0 -69
data/lib/puma/util.rb
CHANGED
@@ -1,10 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
require 'puma/rack/backports/uri/common_193'
|
5
|
-
else
|
6
|
-
require 'uri/common'
|
7
|
-
end
|
3
|
+
require 'uri/common'
|
8
4
|
|
9
5
|
module Puma
|
10
6
|
module Util
|
@@ -14,18 +10,34 @@ module Puma
|
|
14
10
|
IO.pipe
|
15
11
|
end
|
16
12
|
|
17
|
-
#
|
18
|
-
#
|
13
|
+
# An instance method on Thread has been provided to address https://bugs.ruby-lang.org/issues/13632,
|
14
|
+
# which currently effects some older versions of Ruby: 2.2.7 2.2.8 2.2.9 2.2.10 2.3.4 2.4.1
|
15
|
+
# Additional context: https://github.com/puma/puma/pull/1345
|
16
|
+
def purge_interrupt_queue
|
17
|
+
Thread.current.purge_interrupt_queue if Thread.current.respond_to? :purge_interrupt_queue
|
18
|
+
end
|
19
|
+
|
20
|
+
# Escapes and unescapes a URI escaped string with
|
21
|
+
# +encoding+. +encoding+ will be the target encoding of the string
|
22
|
+
# returned, and it defaults to UTF-8
|
19
23
|
if defined?(::Encoding)
|
24
|
+
def escape(s, encoding = Encoding::UTF_8)
|
25
|
+
URI.encode_www_form_component(s, encoding)
|
26
|
+
end
|
27
|
+
|
20
28
|
def unescape(s, encoding = Encoding::UTF_8)
|
21
29
|
URI.decode_www_form_component(s, encoding)
|
22
30
|
end
|
23
31
|
else
|
32
|
+
def escape(s, encoding = nil)
|
33
|
+
URI.encode_www_form_component(s, encoding)
|
34
|
+
end
|
35
|
+
|
24
36
|
def unescape(s, encoding = nil)
|
25
37
|
URI.decode_www_form_component(s, encoding)
|
26
38
|
end
|
27
39
|
end
|
28
|
-
module_function :unescape
|
40
|
+
module_function :unescape, :escape
|
29
41
|
|
30
42
|
DEFAULT_SEP = /[&;] */n
|
31
43
|
|
@@ -54,7 +66,7 @@ module Puma
|
|
54
66
|
end
|
55
67
|
end
|
56
68
|
|
57
|
-
|
69
|
+
params
|
58
70
|
end
|
59
71
|
|
60
72
|
# A case-insensitive Hash that preserves the original case of a
|
@@ -76,6 +88,7 @@ module Puma
|
|
76
88
|
end
|
77
89
|
end
|
78
90
|
|
91
|
+
# @!attribute [r] to_hash
|
79
92
|
def to_hash
|
80
93
|
hash = {}
|
81
94
|
each { |k,v| hash[k] = v }
|
data/lib/puma.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Standard libraries
|
2
4
|
require 'socket'
|
3
5
|
require 'tempfile'
|
@@ -8,16 +10,71 @@ require 'stringio'
|
|
8
10
|
|
9
11
|
require 'thread'
|
10
12
|
|
13
|
+
# use require, see https://github.com/puma/puma/pull/2381
|
14
|
+
require 'puma/puma_http11'
|
15
|
+
|
16
|
+
require_relative 'puma/detect'
|
17
|
+
require_relative 'puma/json_serialization'
|
18
|
+
|
11
19
|
module Puma
|
12
|
-
|
13
|
-
|
14
|
-
autoload :
|
20
|
+
# when Puma is loaded via `Puma::CLI`, all files are loaded via
|
21
|
+
# `require_relative`. The below are for non-standard loading
|
22
|
+
autoload :Const, "#{__dir__}/puma/const"
|
23
|
+
autoload :Server, "#{__dir__}/puma/server"
|
24
|
+
autoload :Launcher, "#{__dir__}/puma/launcher"
|
25
|
+
autoload :LogWriter, "#{__dir__}/puma/log_writer"
|
26
|
+
|
27
|
+
# at present, MiniSSL::Engine is only defined in extension code (puma_http11),
|
28
|
+
# not in minissl.rb
|
29
|
+
HAS_SSL = const_defined?(:MiniSSL, false) && MiniSSL.const_defined?(:Engine, false)
|
15
30
|
|
31
|
+
HAS_UNIX_SOCKET = Object.const_defined?(:UNIXSocket) && !IS_WINDOWS
|
32
|
+
|
33
|
+
if HAS_SSL
|
34
|
+
require_relative 'puma/minissl'
|
35
|
+
else
|
36
|
+
module MiniSSL
|
37
|
+
# this class is defined so that it exists when Puma is compiled
|
38
|
+
# without ssl support, as Server and Reactor use it in rescue statements.
|
39
|
+
class SSLError < StandardError ; end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.ssl?
|
44
|
+
HAS_SSL
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.abstract_unix_socket?
|
48
|
+
@abstract_unix ||=
|
49
|
+
if HAS_UNIX_SOCKET
|
50
|
+
begin
|
51
|
+
::UNIXServer.new("\0puma.temp.unix").close
|
52
|
+
true
|
53
|
+
rescue ArgumentError # darwin
|
54
|
+
false
|
55
|
+
end
|
56
|
+
else
|
57
|
+
false
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# @!attribute [rw] stats_object=
|
16
62
|
def self.stats_object=(val)
|
17
63
|
@get_stats = val
|
18
64
|
end
|
19
65
|
|
66
|
+
# @!attribute [rw] stats_object
|
20
67
|
def self.stats
|
68
|
+
Puma::JSONSerialization.generate @get_stats.stats
|
69
|
+
end
|
70
|
+
|
71
|
+
# @!attribute [r] stats_hash
|
72
|
+
# @version 5.0.0
|
73
|
+
def self.stats_hash
|
21
74
|
@get_stats.stats
|
22
75
|
end
|
76
|
+
|
77
|
+
def self.set_thread_name(name)
|
78
|
+
Thread.current.name = "puma #{name}"
|
79
|
+
end
|
23
80
|
end
|
data/lib/rack/handler/puma.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rack/handler'
|
2
4
|
|
3
5
|
module Rack
|
@@ -9,10 +11,10 @@ module Rack
|
|
9
11
|
}
|
10
12
|
|
11
13
|
def self.config(app, options = {})
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
14
|
+
require_relative '../../puma'
|
15
|
+
require_relative '../../puma/configuration'
|
16
|
+
require_relative '../../puma/log_writer'
|
17
|
+
require_relative '../../puma/launcher'
|
16
18
|
|
17
19
|
default_options = DEFAULT_OPTIONS.dup
|
18
20
|
|
@@ -28,9 +30,8 @@ module Rack
|
|
28
30
|
end
|
29
31
|
|
30
32
|
conf = ::Puma::Configuration.new(options, default_options) do |user_config, file_config, default_config|
|
31
|
-
user_config.quiet
|
32
|
-
|
33
33
|
if options.delete(:Verbose)
|
34
|
+
require 'rack/common_logger'
|
34
35
|
app = Rack::CommonLogger.new(app, STDOUT)
|
35
36
|
end
|
36
37
|
|
@@ -49,6 +50,9 @@ module Rack
|
|
49
50
|
self.set_host_port_to_config(host, port, user_config)
|
50
51
|
end
|
51
52
|
|
53
|
+
if default_options[:Host]
|
54
|
+
file_config.set_default_host(default_options[:Host])
|
55
|
+
end
|
52
56
|
self.set_host_port_to_config(default_options[:Host], default_options[:Port], default_config)
|
53
57
|
|
54
58
|
user_config.app app
|
@@ -56,14 +60,12 @@ module Rack
|
|
56
60
|
conf
|
57
61
|
end
|
58
62
|
|
59
|
-
|
60
|
-
|
61
|
-
def self.run(app, options = {})
|
63
|
+
def self.run(app, **options)
|
62
64
|
conf = self.config(app, options)
|
63
65
|
|
64
|
-
|
66
|
+
log_writer = options.delete(:Silent) ? ::Puma::LogWriter.strings : ::Puma::LogWriter.stdio
|
65
67
|
|
66
|
-
launcher = ::Puma::Launcher.new(conf, :
|
68
|
+
launcher = ::Puma::Launcher.new(conf, :log_writer => log_writer)
|
67
69
|
|
68
70
|
yield launcher if block_given?
|
69
71
|
begin
|
@@ -83,7 +85,7 @@ module Rack
|
|
83
85
|
"Verbose" => "Don't report each request (default: false)"
|
84
86
|
}
|
85
87
|
end
|
86
|
-
|
88
|
+
|
87
89
|
def self.set_host_port_to_config(host, port, config)
|
88
90
|
config.clear_binds! if host || port
|
89
91
|
|
@@ -91,16 +93,16 @@ module Rack
|
|
91
93
|
config.bind "unix://#{host}"
|
92
94
|
elsif host && host =~ /^ssl:\/\//
|
93
95
|
uri = URI.parse(host)
|
94
|
-
uri.port ||= port || ::Puma::Configuration::
|
96
|
+
uri.port ||= port || ::Puma::Configuration::DEFAULTS[:tcp_port]
|
95
97
|
config.bind uri.to_s
|
96
98
|
else
|
97
99
|
|
98
100
|
if host
|
99
|
-
port ||= ::Puma::Configuration::
|
101
|
+
port ||= ::Puma::Configuration::DEFAULTS[:tcp_port]
|
100
102
|
end
|
101
103
|
|
102
104
|
if port
|
103
|
-
host ||= ::Puma::Configuration::
|
105
|
+
host ||= ::Puma::Configuration::DEFAULTS[:tcp_host]
|
104
106
|
config.port port, host
|
105
107
|
end
|
106
108
|
end
|
data/tools/Dockerfile
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# Use this Dockerfile to create minimal reproductions of issues
|
2
|
+
|
3
|
+
FROM ruby:3.1
|
4
|
+
|
5
|
+
# throw errors if Gemfile has been modified since Gemfile.lock
|
6
|
+
RUN bundle config --global frozen 1
|
7
|
+
|
8
|
+
WORKDIR /usr/src/app
|
9
|
+
|
10
|
+
COPY . .
|
11
|
+
RUN gem install bundler
|
12
|
+
RUN bundle install
|
13
|
+
RUN bundle exec rake compile
|
14
|
+
|
15
|
+
EXPOSE 9292
|
16
|
+
CMD bundle exec bin/puma test/rackup/hello.ru
|
data/tools/trickletest.rb
CHANGED
metadata
CHANGED
@@ -1,18 +1,32 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: puma
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 6.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Evan Phoenix
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
13
|
-
|
11
|
+
date: 1980-01-01 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: nio4r
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.0'
|
27
|
+
description: Puma is a simple, fast, threaded, and highly parallel HTTP 1.1 server
|
14
28
|
for Ruby/Rack applications. Puma is intended for use in both development and production
|
15
|
-
environments. It's great for highly
|
29
|
+
environments. It's great for highly parallel Ruby implementations such as Rubinius
|
16
30
|
and JRuby as well as as providing process worker support to support CRuby well.
|
17
31
|
email:
|
18
32
|
- evan@phx.io
|
@@ -30,15 +44,26 @@ files:
|
|
30
44
|
- bin/puma-wild
|
31
45
|
- bin/pumactl
|
32
46
|
- docs/architecture.md
|
47
|
+
- docs/compile_options.md
|
33
48
|
- docs/deployment.md
|
49
|
+
- docs/fork_worker.md
|
34
50
|
- docs/images/puma-connection-flow-no-reactor.png
|
35
51
|
- docs/images/puma-connection-flow.png
|
36
52
|
- docs/images/puma-general-arch.png
|
53
|
+
- docs/jungle/README.md
|
54
|
+
- docs/jungle/rc.d/README.md
|
55
|
+
- docs/jungle/rc.d/puma
|
56
|
+
- docs/jungle/rc.d/puma.conf
|
57
|
+
- docs/kubernetes.md
|
37
58
|
- docs/nginx.md
|
38
59
|
- docs/plugins.md
|
60
|
+
- docs/rails_dev_mode.md
|
39
61
|
- docs/restart.md
|
40
62
|
- docs/signals.md
|
63
|
+
- docs/stats.md
|
41
64
|
- docs/systemd.md
|
65
|
+
- docs/testing_benchmarks_local_files.md
|
66
|
+
- docs/testing_test_rackup_ci_files.md
|
42
67
|
- ext/puma_http11/PumaHttp11Service.java
|
43
68
|
- ext/puma_http11/ext_help.h
|
44
69
|
- ext/puma_http11/extconf.rb
|
@@ -47,68 +72,64 @@ files:
|
|
47
72
|
- ext/puma_http11/http11_parser.java.rl
|
48
73
|
- ext/puma_http11/http11_parser.rl
|
49
74
|
- ext/puma_http11/http11_parser_common.rl
|
50
|
-
- ext/puma_http11/io_buffer.c
|
51
75
|
- ext/puma_http11/mini_ssl.c
|
76
|
+
- ext/puma_http11/no_ssl/PumaHttp11Service.java
|
52
77
|
- ext/puma_http11/org/jruby/puma/Http11.java
|
53
78
|
- ext/puma_http11/org/jruby/puma/Http11Parser.java
|
54
79
|
- ext/puma_http11/org/jruby/puma/MiniSSL.java
|
55
80
|
- ext/puma_http11/puma_http11.c
|
56
81
|
- lib/puma.rb
|
57
|
-
- lib/puma/accept_nonblock.rb
|
58
82
|
- lib/puma/app/status.rb
|
59
83
|
- lib/puma/binder.rb
|
60
84
|
- lib/puma/cli.rb
|
61
85
|
- lib/puma/client.rb
|
62
86
|
- lib/puma/cluster.rb
|
87
|
+
- lib/puma/cluster/worker.rb
|
88
|
+
- lib/puma/cluster/worker_handle.rb
|
63
89
|
- lib/puma/commonlogger.rb
|
64
|
-
- lib/puma/compat.rb
|
65
90
|
- lib/puma/configuration.rb
|
66
91
|
- lib/puma/const.rb
|
67
92
|
- lib/puma/control_cli.rb
|
68
|
-
- lib/puma/convenient.rb
|
69
|
-
- lib/puma/daemon_ext.rb
|
70
|
-
- lib/puma/delegation.rb
|
71
93
|
- lib/puma/detect.rb
|
72
94
|
- lib/puma/dsl.rb
|
95
|
+
- lib/puma/error_logger.rb
|
73
96
|
- lib/puma/events.rb
|
74
97
|
- lib/puma/io_buffer.rb
|
75
|
-
- lib/puma/java_io_buffer.rb
|
76
98
|
- lib/puma/jruby_restart.rb
|
99
|
+
- lib/puma/json_serialization.rb
|
77
100
|
- lib/puma/launcher.rb
|
101
|
+
- lib/puma/launcher/bundle_pruner.rb
|
102
|
+
- lib/puma/log_writer.rb
|
78
103
|
- lib/puma/minissl.rb
|
104
|
+
- lib/puma/minissl/context_builder.rb
|
79
105
|
- lib/puma/null_io.rb
|
80
106
|
- lib/puma/plugin.rb
|
81
107
|
- lib/puma/plugin/tmp_restart.rb
|
82
|
-
- lib/puma/rack/backports/uri/common_193.rb
|
83
108
|
- lib/puma/rack/builder.rb
|
84
109
|
- lib/puma/rack/urlmap.rb
|
85
110
|
- lib/puma/rack_default.rb
|
86
111
|
- lib/puma/reactor.rb
|
112
|
+
- lib/puma/request.rb
|
87
113
|
- lib/puma/runner.rb
|
88
114
|
- lib/puma/server.rb
|
89
115
|
- lib/puma/single.rb
|
90
116
|
- lib/puma/state_file.rb
|
91
|
-
- lib/puma/
|
117
|
+
- lib/puma/systemd.rb
|
92
118
|
- lib/puma/thread_pool.rb
|
93
119
|
- lib/puma/util.rb
|
94
120
|
- lib/rack/handler/puma.rb
|
95
|
-
- tools/
|
96
|
-
- tools/jungle/init.d/README.md
|
97
|
-
- tools/jungle/init.d/puma
|
98
|
-
- tools/jungle/init.d/run-puma
|
99
|
-
- tools/jungle/rc.d/README.md
|
100
|
-
- tools/jungle/rc.d/puma
|
101
|
-
- tools/jungle/rc.d/puma.conf
|
102
|
-
- tools/jungle/upstart/README.md
|
103
|
-
- tools/jungle/upstart/puma-manager.conf
|
104
|
-
- tools/jungle/upstart/puma.conf
|
121
|
+
- tools/Dockerfile
|
105
122
|
- tools/trickletest.rb
|
106
|
-
homepage:
|
123
|
+
homepage: https://puma.io
|
107
124
|
licenses:
|
108
125
|
- BSD-3-Clause
|
109
126
|
metadata:
|
110
|
-
|
111
|
-
|
127
|
+
bug_tracker_uri: https://github.com/puma/puma/issues
|
128
|
+
changelog_uri: https://github.com/puma/puma/blob/master/History.md
|
129
|
+
homepage_uri: https://puma.io
|
130
|
+
source_code_uri: https://github.com/puma/puma
|
131
|
+
rubygems_mfa_required: 'true'
|
132
|
+
post_install_message:
|
112
133
|
rdoc_options: []
|
113
134
|
require_paths:
|
114
135
|
- lib
|
@@ -116,17 +137,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
116
137
|
requirements:
|
117
138
|
- - ">="
|
118
139
|
- !ruby/object:Gem::Version
|
119
|
-
version:
|
140
|
+
version: '2.4'
|
120
141
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
121
142
|
requirements:
|
122
143
|
- - ">="
|
123
144
|
- !ruby/object:Gem::Version
|
124
145
|
version: '0'
|
125
146
|
requirements: []
|
126
|
-
|
127
|
-
|
128
|
-
signing_key:
|
147
|
+
rubygems_version: 3.2.26
|
148
|
+
signing_key:
|
129
149
|
specification_version: 4
|
130
|
-
summary: Puma is a simple, fast, threaded, and highly
|
150
|
+
summary: Puma is a simple, fast, threaded, and highly parallel HTTP 1.1 server for
|
131
151
|
Ruby/Rack applications
|
132
152
|
test_files: []
|
data/ext/puma_http11/io_buffer.c
DELETED
@@ -1,155 +0,0 @@
|
|
1
|
-
#define RSTRING_NOT_MODIFIED 1
|
2
|
-
#include "ruby.h"
|
3
|
-
|
4
|
-
#include <sys/types.h>
|
5
|
-
|
6
|
-
struct buf_int {
|
7
|
-
uint8_t* top;
|
8
|
-
uint8_t* cur;
|
9
|
-
|
10
|
-
size_t size;
|
11
|
-
};
|
12
|
-
|
13
|
-
#define BUF_DEFAULT_SIZE 4096
|
14
|
-
#define BUF_TOLERANCE 32
|
15
|
-
|
16
|
-
static void buf_free(struct buf_int* internal) {
|
17
|
-
xfree(internal->top);
|
18
|
-
xfree(internal);
|
19
|
-
}
|
20
|
-
|
21
|
-
static VALUE buf_alloc(VALUE self) {
|
22
|
-
VALUE buf;
|
23
|
-
struct buf_int* internal;
|
24
|
-
|
25
|
-
buf = Data_Make_Struct(self, struct buf_int, 0, buf_free, internal);
|
26
|
-
|
27
|
-
internal->size = BUF_DEFAULT_SIZE;
|
28
|
-
internal->top = ALLOC_N(uint8_t, BUF_DEFAULT_SIZE);
|
29
|
-
internal->cur = internal->top;
|
30
|
-
|
31
|
-
return buf;
|
32
|
-
}
|
33
|
-
|
34
|
-
static VALUE buf_append(VALUE self, VALUE str) {
|
35
|
-
struct buf_int* b;
|
36
|
-
size_t used, str_len, new_size;
|
37
|
-
|
38
|
-
Data_Get_Struct(self, struct buf_int, b);
|
39
|
-
|
40
|
-
used = b->cur - b->top;
|
41
|
-
|
42
|
-
StringValue(str);
|
43
|
-
str_len = RSTRING_LEN(str);
|
44
|
-
|
45
|
-
new_size = used + str_len;
|
46
|
-
|
47
|
-
if(new_size > b->size) {
|
48
|
-
size_t n = b->size + (b->size / 2);
|
49
|
-
uint8_t* top;
|
50
|
-
uint8_t* old;
|
51
|
-
|
52
|
-
new_size = (n > new_size ? n : new_size + BUF_TOLERANCE);
|
53
|
-
|
54
|
-
top = ALLOC_N(uint8_t, new_size);
|
55
|
-
old = b->top;
|
56
|
-
memcpy(top, old, used);
|
57
|
-
b->top = top;
|
58
|
-
b->cur = top + used;
|
59
|
-
b->size = new_size;
|
60
|
-
xfree(old);
|
61
|
-
}
|
62
|
-
|
63
|
-
memcpy(b->cur, RSTRING_PTR(str), str_len);
|
64
|
-
b->cur += str_len;
|
65
|
-
|
66
|
-
return self;
|
67
|
-
}
|
68
|
-
|
69
|
-
static VALUE buf_append2(int argc, VALUE* argv, VALUE self) {
|
70
|
-
struct buf_int* b;
|
71
|
-
size_t used, new_size;
|
72
|
-
int i;
|
73
|
-
VALUE str;
|
74
|
-
|
75
|
-
Data_Get_Struct(self, struct buf_int, b);
|
76
|
-
|
77
|
-
used = b->cur - b->top;
|
78
|
-
new_size = used;
|
79
|
-
|
80
|
-
for(i = 0; i < argc; i++) {
|
81
|
-
StringValue(argv[i]);
|
82
|
-
|
83
|
-
str = argv[i];
|
84
|
-
|
85
|
-
new_size += RSTRING_LEN(str);
|
86
|
-
}
|
87
|
-
|
88
|
-
if(new_size > b->size) {
|
89
|
-
size_t n = b->size + (b->size / 2);
|
90
|
-
uint8_t* top;
|
91
|
-
uint8_t* old;
|
92
|
-
|
93
|
-
new_size = (n > new_size ? n : new_size + BUF_TOLERANCE);
|
94
|
-
|
95
|
-
top = ALLOC_N(uint8_t, new_size);
|
96
|
-
old = b->top;
|
97
|
-
memcpy(top, old, used);
|
98
|
-
b->top = top;
|
99
|
-
b->cur = top + used;
|
100
|
-
b->size = new_size;
|
101
|
-
xfree(old);
|
102
|
-
}
|
103
|
-
|
104
|
-
for(i = 0; i < argc; i++) {
|
105
|
-
long str_len;
|
106
|
-
str = argv[i];
|
107
|
-
str_len = RSTRING_LEN(str);
|
108
|
-
memcpy(b->cur, RSTRING_PTR(str), str_len);
|
109
|
-
b->cur += str_len;
|
110
|
-
}
|
111
|
-
|
112
|
-
return self;
|
113
|
-
}
|
114
|
-
|
115
|
-
static VALUE buf_to_str(VALUE self) {
|
116
|
-
struct buf_int* b;
|
117
|
-
Data_Get_Struct(self, struct buf_int, b);
|
118
|
-
|
119
|
-
return rb_str_new((const char*)(b->top), b->cur - b->top);
|
120
|
-
}
|
121
|
-
|
122
|
-
static VALUE buf_used(VALUE self) {
|
123
|
-
struct buf_int* b;
|
124
|
-
Data_Get_Struct(self, struct buf_int, b);
|
125
|
-
|
126
|
-
return INT2FIX(b->cur - b->top);
|
127
|
-
}
|
128
|
-
|
129
|
-
static VALUE buf_capa(VALUE self) {
|
130
|
-
struct buf_int* b;
|
131
|
-
Data_Get_Struct(self, struct buf_int, b);
|
132
|
-
|
133
|
-
return INT2FIX(b->size);
|
134
|
-
}
|
135
|
-
|
136
|
-
static VALUE buf_reset(VALUE self) {
|
137
|
-
struct buf_int* b;
|
138
|
-
Data_Get_Struct(self, struct buf_int, b);
|
139
|
-
|
140
|
-
b->cur = b->top;
|
141
|
-
return self;
|
142
|
-
}
|
143
|
-
|
144
|
-
void Init_io_buffer(VALUE puma) {
|
145
|
-
VALUE buf = rb_define_class_under(puma, "IOBuffer", rb_cObject);
|
146
|
-
|
147
|
-
rb_define_alloc_func(buf, buf_alloc);
|
148
|
-
rb_define_method(buf, "<<", buf_append, 1);
|
149
|
-
rb_define_method(buf, "append", buf_append2, -1);
|
150
|
-
rb_define_method(buf, "to_str", buf_to_str, 0);
|
151
|
-
rb_define_method(buf, "to_s", buf_to_str, 0);
|
152
|
-
rb_define_method(buf, "used", buf_used, 0);
|
153
|
-
rb_define_method(buf, "capacity", buf_capa, 0);
|
154
|
-
rb_define_method(buf, "reset", buf_reset, 0);
|
155
|
-
}
|
data/lib/puma/accept_nonblock.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
require 'openssl'
|
2
|
-
|
3
|
-
module OpenSSL
|
4
|
-
module SSL
|
5
|
-
class SSLServer
|
6
|
-
unless public_method_defined? :accept_nonblock
|
7
|
-
def accept_nonblock
|
8
|
-
sock = @svr.accept_nonblock
|
9
|
-
|
10
|
-
begin
|
11
|
-
ssl = OpenSSL::SSL::SSLSocket.new(sock, @ctx)
|
12
|
-
ssl.sync_close = true
|
13
|
-
ssl.accept if @start_immediately
|
14
|
-
ssl
|
15
|
-
rescue SSLError => ex
|
16
|
-
sock.close
|
17
|
-
raise ex
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
data/lib/puma/compat.rb
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
# Provides code to work properly on 1.8 and 1.9
|
2
|
-
|
3
|
-
class String
|
4
|
-
unless method_defined? :bytesize
|
5
|
-
alias_method :bytesize, :size
|
6
|
-
end
|
7
|
-
|
8
|
-
unless method_defined? :byteslice
|
9
|
-
def byteslice(*arg)
|
10
|
-
enc = self.encoding
|
11
|
-
self.dup.force_encoding(Encoding::ASCII_8BIT).slice(*arg).force_encoding(enc)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
data/lib/puma/convenient.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
require 'puma/launcher'
|
2
|
-
require 'puma/configuration'
|
3
|
-
|
4
|
-
module Puma
|
5
|
-
def self.run(opts={})
|
6
|
-
cfg = Puma::Configuration.new do |user_config|
|
7
|
-
if port = opts[:port]
|
8
|
-
user_config.port port
|
9
|
-
end
|
10
|
-
|
11
|
-
user_config.quiet
|
12
|
-
|
13
|
-
yield c
|
14
|
-
end
|
15
|
-
|
16
|
-
cfg.clamp
|
17
|
-
|
18
|
-
events = Puma::Events.null
|
19
|
-
|
20
|
-
launcher = Puma::Launcher.new cfg, :events => events
|
21
|
-
launcher.run
|
22
|
-
end
|
23
|
-
end
|
data/lib/puma/daemon_ext.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
module Process
|
2
|
-
|
3
|
-
# This overrides the default version because it is broken if it
|
4
|
-
# exists.
|
5
|
-
|
6
|
-
if respond_to? :daemon
|
7
|
-
class << self
|
8
|
-
remove_method :daemon
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.daemon(nochdir=false, noclose=false)
|
13
|
-
exit if fork # Parent exits, child continues.
|
14
|
-
|
15
|
-
Process.setsid # Become session leader.
|
16
|
-
|
17
|
-
exit if fork # Zap session leader. See [1].
|
18
|
-
|
19
|
-
Dir.chdir "/" unless nochdir # Release old working directory.
|
20
|
-
|
21
|
-
if !noclose
|
22
|
-
STDIN.reopen File.open("/dev/null", "r")
|
23
|
-
|
24
|
-
null_out = File.open "/dev/null", "w"
|
25
|
-
STDOUT.reopen null_out
|
26
|
-
STDERR.reopen null_out
|
27
|
-
end
|
28
|
-
|
29
|
-
0
|
30
|
-
end
|
31
|
-
end
|