puma 4.1.1 → 4.2.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 +37 -9
- data/README.md +7 -16
- data/docs/plugins.md +20 -10
- data/ext/puma_http11/http11_parser.c +37 -62
- data/ext/puma_http11/http11_parser_common.rl +3 -3
- data/lib/puma.rb +6 -0
- data/lib/puma/app/status.rb +29 -28
- data/lib/puma/binder.rb +36 -12
- data/lib/puma/cli.rb +4 -0
- data/lib/puma/client.rb +194 -206
- data/lib/puma/cluster.rb +13 -12
- data/lib/puma/const.rb +15 -18
- data/lib/puma/control_cli.rb +11 -2
- data/lib/puma/dsl.rb +17 -1
- data/lib/puma/launcher.rb +87 -46
- data/lib/puma/plugin.rb +5 -2
- data/lib/puma/reactor.rb +5 -4
- data/lib/puma/runner.rb +3 -3
- data/lib/puma/server.rb +14 -11
- data/lib/puma/thread_pool.rb +9 -31
- data/lib/rack/handler/puma.rb +0 -2
- data/tools/docker/Dockerfile +16 -0
- data/tools/trickletest.rb +0 -1
- metadata +4 -4
- data/lib/puma/daemon_ext.rb +0 -33
- data/lib/puma/delegation.rb +0 -13
data/lib/puma/runner.rb
CHANGED
@@ -53,12 +53,12 @@ module Puma
|
|
53
53
|
|
54
54
|
uri = URI.parse str
|
55
55
|
|
56
|
-
app = Puma::App::Status.new @launcher
|
57
|
-
|
58
56
|
if token = @options[:control_auth_token]
|
59
|
-
|
57
|
+
token = nil if token.empty? || token == 'none'
|
60
58
|
end
|
61
59
|
|
60
|
+
app = Puma::App::Status.new @launcher, token
|
61
|
+
|
62
62
|
control = Puma::Server.new app, @launcher.events
|
63
63
|
control.min_threads = 0
|
64
64
|
control.max_threads = 1
|
data/lib/puma/server.rb
CHANGED
@@ -9,13 +9,13 @@ require 'puma/null_io'
|
|
9
9
|
require 'puma/reactor'
|
10
10
|
require 'puma/client'
|
11
11
|
require 'puma/binder'
|
12
|
-
require 'puma/delegation'
|
13
12
|
require 'puma/accept_nonblock'
|
14
13
|
require 'puma/util'
|
15
14
|
|
16
15
|
require 'puma/puma_http11'
|
17
16
|
|
18
17
|
require 'socket'
|
18
|
+
require 'forwardable'
|
19
19
|
|
20
20
|
module Puma
|
21
21
|
|
@@ -32,7 +32,7 @@ module Puma
|
|
32
32
|
class Server
|
33
33
|
|
34
34
|
include Puma::Const
|
35
|
-
extend
|
35
|
+
extend Forwardable
|
36
36
|
|
37
37
|
attr_reader :thread
|
38
38
|
attr_reader :events
|
@@ -89,10 +89,7 @@ module Puma
|
|
89
89
|
|
90
90
|
attr_accessor :binder, :leak_stack_on_error, :early_hints
|
91
91
|
|
92
|
-
|
93
|
-
forward :add_ssl_listener, :@binder
|
94
|
-
forward :add_unix_listener, :@binder
|
95
|
-
forward :connected_port, :@binder
|
92
|
+
def_delegators :@binder, :add_tcp_listener, :add_ssl_listener, :add_unix_listener, :connected_port
|
96
93
|
|
97
94
|
def inherit_binder(bind)
|
98
95
|
@binder = bind
|
@@ -207,7 +204,10 @@ module Puma
|
|
207
204
|
@events.fire :state, :running
|
208
205
|
|
209
206
|
if background
|
210
|
-
@thread = Thread.new
|
207
|
+
@thread = Thread.new do
|
208
|
+
Puma.set_thread_name "server"
|
209
|
+
handle_servers_lopez_mode
|
210
|
+
end
|
211
211
|
return @thread
|
212
212
|
else
|
213
213
|
handle_servers_lopez_mode
|
@@ -317,7 +317,7 @@ module Puma
|
|
317
317
|
|
318
318
|
@events.ssl_error self, addr, cert, e
|
319
319
|
rescue HttpParserError => e
|
320
|
-
client.
|
320
|
+
client.write_error(400)
|
321
321
|
client.close
|
322
322
|
|
323
323
|
@events.parse_error self, client.env, e
|
@@ -351,7 +351,10 @@ module Puma
|
|
351
351
|
@events.fire :state, :running
|
352
352
|
|
353
353
|
if background
|
354
|
-
@thread = Thread.new
|
354
|
+
@thread = Thread.new do
|
355
|
+
Puma.set_thread_name "server"
|
356
|
+
handle_servers
|
357
|
+
end
|
355
358
|
return @thread
|
356
359
|
else
|
357
360
|
handle_servers
|
@@ -505,7 +508,7 @@ module Puma
|
|
505
508
|
rescue HttpParserError => e
|
506
509
|
lowlevel_error(e, client.env)
|
507
510
|
|
508
|
-
client.
|
511
|
+
client.write_error(400)
|
509
512
|
|
510
513
|
@events.parse_error self, client.env, e
|
511
514
|
|
@@ -513,7 +516,7 @@ module Puma
|
|
513
516
|
rescue StandardError => e
|
514
517
|
lowlevel_error(e, client.env)
|
515
518
|
|
516
|
-
client.
|
519
|
+
client.write_error(500)
|
517
520
|
|
518
521
|
@events.unknown_error self, e, "Read"
|
519
522
|
|
data/lib/puma/thread_pool.rb
CHANGED
@@ -87,8 +87,7 @@ module Puma
|
|
87
87
|
@spawned += 1
|
88
88
|
|
89
89
|
th = Thread.new(@spawned) do |spawned|
|
90
|
-
|
91
|
-
Thread.current.name = 'puma %03i' % spawned if Thread.current.respond_to?(:name=)
|
90
|
+
Puma.set_thread_name 'threadpool %03i' % spawned
|
92
91
|
todo = @todo
|
93
92
|
block = @block
|
94
93
|
mutex = @mutex
|
@@ -244,10 +243,12 @@ module Puma
|
|
244
243
|
end
|
245
244
|
end
|
246
245
|
|
247
|
-
class
|
248
|
-
def initialize(pool, timeout)
|
246
|
+
class Automaton
|
247
|
+
def initialize(pool, timeout, thread_name, message)
|
249
248
|
@pool = pool
|
250
249
|
@timeout = timeout
|
250
|
+
@thread_name = thread_name
|
251
|
+
@message = message
|
251
252
|
@running = false
|
252
253
|
end
|
253
254
|
|
@@ -255,8 +256,9 @@ module Puma
|
|
255
256
|
@running = true
|
256
257
|
|
257
258
|
@thread = Thread.new do
|
259
|
+
Puma.set_thread_name @thread_name
|
258
260
|
while @running
|
259
|
-
@pool.
|
261
|
+
@pool.public_send(@message)
|
260
262
|
sleep @timeout
|
261
263
|
end
|
262
264
|
end
|
@@ -269,36 +271,12 @@ module Puma
|
|
269
271
|
end
|
270
272
|
|
271
273
|
def auto_trim!(timeout=30)
|
272
|
-
@auto_trim =
|
274
|
+
@auto_trim = Automaton.new(self, timeout, "threadpool trimmer", :trim)
|
273
275
|
@auto_trim.start!
|
274
276
|
end
|
275
277
|
|
276
|
-
class Reaper
|
277
|
-
def initialize(pool, timeout)
|
278
|
-
@pool = pool
|
279
|
-
@timeout = timeout
|
280
|
-
@running = false
|
281
|
-
end
|
282
|
-
|
283
|
-
def start!
|
284
|
-
@running = true
|
285
|
-
|
286
|
-
@thread = Thread.new do
|
287
|
-
while @running
|
288
|
-
@pool.reap
|
289
|
-
sleep @timeout
|
290
|
-
end
|
291
|
-
end
|
292
|
-
end
|
293
|
-
|
294
|
-
def stop
|
295
|
-
@running = false
|
296
|
-
@thread.wakeup
|
297
|
-
end
|
298
|
-
end
|
299
|
-
|
300
278
|
def auto_reap!(timeout=5)
|
301
|
-
@reaper =
|
279
|
+
@reaper = Automaton.new(self, timeout, "threadpool reaper", :reap)
|
302
280
|
@reaper.start!
|
303
281
|
end
|
304
282
|
|
data/lib/rack/handler/puma.rb
CHANGED
@@ -0,0 +1,16 @@
|
|
1
|
+
# Use this Dockerfile to create minimal reproductions of issues
|
2
|
+
|
3
|
+
FROM ruby:2.6
|
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,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: puma
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Evan Phoenix
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-10-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nio4r
|
@@ -80,8 +80,6 @@ files:
|
|
80
80
|
- lib/puma/const.rb
|
81
81
|
- lib/puma/control_cli.rb
|
82
82
|
- lib/puma/convenient.rb
|
83
|
-
- lib/puma/daemon_ext.rb
|
84
|
-
- lib/puma/delegation.rb
|
85
83
|
- lib/puma/detect.rb
|
86
84
|
- lib/puma/dsl.rb
|
87
85
|
- lib/puma/events.rb
|
@@ -104,6 +102,7 @@ files:
|
|
104
102
|
- lib/puma/thread_pool.rb
|
105
103
|
- lib/puma/util.rb
|
106
104
|
- lib/rack/handler/puma.rb
|
105
|
+
- tools/docker/Dockerfile
|
107
106
|
- tools/jungle/README.md
|
108
107
|
- tools/jungle/init.d/README.md
|
109
108
|
- tools/jungle/init.d/puma
|
@@ -120,6 +119,7 @@ licenses:
|
|
120
119
|
- BSD-3-Clause
|
121
120
|
metadata:
|
122
121
|
msys2_mingw_dependencies: openssl
|
122
|
+
changelog_uri: https://github.com/puma/puma/blob/master/History.md
|
123
123
|
post_install_message:
|
124
124
|
rdoc_options: []
|
125
125
|
require_paths:
|
data/lib/puma/daemon_ext.rb
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Process
|
4
|
-
|
5
|
-
# This overrides the default version because it is broken if it
|
6
|
-
# exists.
|
7
|
-
|
8
|
-
if respond_to? :daemon
|
9
|
-
class << self
|
10
|
-
remove_method :daemon
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def self.daemon(nochdir=false, noclose=false)
|
15
|
-
exit if fork # Parent exits, child continues.
|
16
|
-
|
17
|
-
Process.setsid # Become session leader.
|
18
|
-
|
19
|
-
exit if fork # Zap session leader. See [1].
|
20
|
-
|
21
|
-
Dir.chdir "/" unless nochdir # Release old working directory.
|
22
|
-
|
23
|
-
if !noclose
|
24
|
-
STDIN.reopen File.open("/dev/null", "r")
|
25
|
-
|
26
|
-
null_out = File.open "/dev/null", "w"
|
27
|
-
STDOUT.reopen null_out
|
28
|
-
STDERR.reopen null_out
|
29
|
-
end
|
30
|
-
|
31
|
-
0
|
32
|
-
end
|
33
|
-
end
|