puma 3.12.0 → 4.3.8

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.

Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +164 -0
  3. data/README.md +76 -48
  4. data/docs/architecture.md +1 -0
  5. data/docs/deployment.md +24 -4
  6. data/docs/plugins.md +20 -10
  7. data/docs/restart.md +4 -2
  8. data/docs/systemd.md +27 -9
  9. data/docs/tcp_mode.md +96 -0
  10. data/ext/puma_http11/PumaHttp11Service.java +2 -0
  11. data/ext/puma_http11/extconf.rb +13 -0
  12. data/ext/puma_http11/http11_parser.c +40 -63
  13. data/ext/puma_http11/http11_parser.java.rl +21 -37
  14. data/ext/puma_http11/http11_parser.rl +3 -1
  15. data/ext/puma_http11/http11_parser_common.rl +3 -3
  16. data/ext/puma_http11/mini_ssl.c +86 -4
  17. data/ext/puma_http11/org/jruby/puma/Http11.java +106 -114
  18. data/ext/puma_http11/org/jruby/puma/Http11Parser.java +91 -106
  19. data/ext/puma_http11/org/jruby/puma/IOBuffer.java +72 -0
  20. data/ext/puma_http11/org/jruby/puma/MiniSSL.java +15 -4
  21. data/ext/puma_http11/puma_http11.c +3 -0
  22. data/lib/puma.rb +8 -0
  23. data/lib/puma/accept_nonblock.rb +7 -1
  24. data/lib/puma/app/status.rb +37 -29
  25. data/lib/puma/binder.rb +47 -68
  26. data/lib/puma/cli.rb +6 -0
  27. data/lib/puma/client.rb +244 -199
  28. data/lib/puma/cluster.rb +55 -30
  29. data/lib/puma/commonlogger.rb +2 -0
  30. data/lib/puma/configuration.rb +6 -3
  31. data/lib/puma/const.rb +32 -18
  32. data/lib/puma/control_cli.rb +41 -14
  33. data/lib/puma/detect.rb +2 -0
  34. data/lib/puma/dsl.rb +311 -77
  35. data/lib/puma/events.rb +6 -1
  36. data/lib/puma/io_buffer.rb +3 -6
  37. data/lib/puma/jruby_restart.rb +2 -0
  38. data/lib/puma/launcher.rb +99 -55
  39. data/lib/puma/minissl.rb +37 -17
  40. data/lib/puma/minissl/context_builder.rb +76 -0
  41. data/lib/puma/null_io.rb +2 -0
  42. data/lib/puma/plugin.rb +7 -2
  43. data/lib/puma/plugin/tmp_restart.rb +2 -0
  44. data/lib/puma/rack/builder.rb +4 -1
  45. data/lib/puma/rack/urlmap.rb +2 -0
  46. data/lib/puma/rack_default.rb +2 -0
  47. data/lib/puma/reactor.rb +112 -57
  48. data/lib/puma/runner.rb +13 -3
  49. data/lib/puma/server.rb +119 -48
  50. data/lib/puma/single.rb +5 -3
  51. data/lib/puma/state_file.rb +2 -0
  52. data/lib/puma/tcp_logger.rb +2 -0
  53. data/lib/puma/thread_pool.rb +17 -33
  54. data/lib/puma/util.rb +2 -6
  55. data/lib/rack/handler/puma.rb +6 -3
  56. data/tools/docker/Dockerfile +16 -0
  57. data/tools/jungle/init.d/puma +6 -6
  58. data/tools/trickletest.rb +0 -1
  59. metadata +26 -14
  60. data/lib/puma/compat.rb +0 -14
  61. data/lib/puma/convenient.rb +0 -23
  62. data/lib/puma/daemon_ext.rb +0 -31
  63. data/lib/puma/delegation.rb +0 -11
  64. data/lib/puma/java_io_buffer.rb +0 -45
  65. data/lib/puma/rack/backports/uri/common_193.rb +0 -33
data/lib/puma/util.rb CHANGED
@@ -1,10 +1,6 @@
1
- major, minor, patch = RUBY_VERSION.split('.').map { |v| v.to_i }
1
+ # frozen_string_literal: true
2
2
 
3
- if major == 1 && minor == 9 && patch == 3 && RUBY_PATCHLEVEL < 125
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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rack/handler'
2
4
 
3
5
  module Rack
@@ -49,6 +51,9 @@ module Rack
49
51
  self.set_host_port_to_config(host, port, user_config)
50
52
  end
51
53
 
54
+ if default_options[:Host]
55
+ file_config.set_default_host(default_options[:Host])
56
+ end
52
57
  self.set_host_port_to_config(default_options[:Host], default_options[:Port], default_config)
53
58
 
54
59
  user_config.app app
@@ -56,8 +61,6 @@ module Rack
56
61
  conf
57
62
  end
58
63
 
59
-
60
-
61
64
  def self.run(app, options = {})
62
65
  conf = self.config(app, options)
63
66
 
@@ -83,7 +86,7 @@ module Rack
83
86
  "Verbose" => "Don't report each request (default: false)"
84
87
  }
85
88
  end
86
- private
89
+
87
90
  def self.set_host_port_to_config(host, port, config)
88
91
  config.clear_binds! if host || port
89
92
 
@@ -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
@@ -47,11 +47,11 @@ do_start_one() {
47
47
  PIDFILE=$1/tmp/puma/pid
48
48
  if [ -e $PIDFILE ]; then
49
49
  PID=`cat $PIDFILE`
50
- # If the puma isn't running, run it, otherwise restart it.
50
+ # If the puma is running, restart it, otherwise run it.
51
51
  if ps -p $PID > /dev/null; then
52
- do_start_one_do $1
53
- else
54
52
  do_restart_one $1
53
+ else
54
+ do_start_one_do $1
55
55
  fi
56
56
  else
57
57
  do_start_one_do $1
@@ -106,8 +106,6 @@ do_stop_one() {
106
106
  if [ -e $PIDFILE ]; then
107
107
  PID=`cat $PIDFILE`
108
108
  if ps -p $PID > /dev/null; then
109
- log_daemon_msg "---> Puma $1 isn't running."
110
- else
111
109
  log_daemon_msg "---> About to kill PID `cat $PIDFILE`"
112
110
  if [ "$USE_LOCAL_BUNDLE" -eq 1 ]; then
113
111
  cd $1 && bundle exec pumactl --state $STATEFILE stop
@@ -116,6 +114,8 @@ do_stop_one() {
116
114
  fi
117
115
  # Many daemons don't delete their pidfiles when they exit.
118
116
  rm -f $PIDFILE $STATEFILE
117
+ else
118
+ log_daemon_msg "---> Puma $1 isn't running."
119
119
  fi
120
120
  else
121
121
  log_daemon_msg "---> No puma here..."
@@ -398,7 +398,7 @@ case "$1" in
398
398
  ;;
399
399
  remove)
400
400
  if [ "$#" -lt 2 ]; then
401
- echo "Please, specifiy the app's directory to remove."
401
+ echo "Please, specify the app's directory to remove."
402
402
  exit 1
403
403
  else
404
404
  do_remove $2
data/tools/trickletest.rb CHANGED
@@ -38,7 +38,6 @@ ARGV[1].to_i.times do
38
38
  do_test(st, size)
39
39
  end
40
40
 
41
- t.abort_on_exception = true
42
41
  threads << t
43
42
  end
44
43
 
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: puma
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.12.0
4
+ version: 4.3.8
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: 2018-07-13 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2021-05-11 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'
13
27
  description: Puma is a simple, fast, threaded, and highly concurrent HTTP 1.1 server
14
28
  for Ruby/Rack applications. Puma is intended for use in both development and production
15
29
  environments. It's great for highly concurrent Ruby implementations such as Rubinius
@@ -39,6 +53,7 @@ files:
39
53
  - docs/restart.md
40
54
  - docs/signals.md
41
55
  - docs/systemd.md
56
+ - docs/tcp_mode.md
42
57
  - ext/puma_http11/PumaHttp11Service.java
43
58
  - ext/puma_http11/ext_help.h
44
59
  - ext/puma_http11/extconf.rb
@@ -51,6 +66,7 @@ files:
51
66
  - ext/puma_http11/mini_ssl.c
52
67
  - ext/puma_http11/org/jruby/puma/Http11.java
53
68
  - ext/puma_http11/org/jruby/puma/Http11Parser.java
69
+ - ext/puma_http11/org/jruby/puma/IOBuffer.java
54
70
  - ext/puma_http11/org/jruby/puma/MiniSSL.java
55
71
  - ext/puma_http11/puma_http11.c
56
72
  - lib/puma.rb
@@ -61,25 +77,20 @@ files:
61
77
  - lib/puma/client.rb
62
78
  - lib/puma/cluster.rb
63
79
  - lib/puma/commonlogger.rb
64
- - lib/puma/compat.rb
65
80
  - lib/puma/configuration.rb
66
81
  - lib/puma/const.rb
67
82
  - lib/puma/control_cli.rb
68
- - lib/puma/convenient.rb
69
- - lib/puma/daemon_ext.rb
70
- - lib/puma/delegation.rb
71
83
  - lib/puma/detect.rb
72
84
  - lib/puma/dsl.rb
73
85
  - lib/puma/events.rb
74
86
  - lib/puma/io_buffer.rb
75
- - lib/puma/java_io_buffer.rb
76
87
  - lib/puma/jruby_restart.rb
77
88
  - lib/puma/launcher.rb
78
89
  - lib/puma/minissl.rb
90
+ - lib/puma/minissl/context_builder.rb
79
91
  - lib/puma/null_io.rb
80
92
  - lib/puma/plugin.rb
81
93
  - lib/puma/plugin/tmp_restart.rb
82
- - lib/puma/rack/backports/uri/common_193.rb
83
94
  - lib/puma/rack/builder.rb
84
95
  - lib/puma/rack/urlmap.rb
85
96
  - lib/puma/rack_default.rb
@@ -92,6 +103,7 @@ files:
92
103
  - lib/puma/thread_pool.rb
93
104
  - lib/puma/util.rb
94
105
  - lib/rack/handler/puma.rb
106
+ - tools/docker/Dockerfile
95
107
  - tools/jungle/README.md
96
108
  - tools/jungle/init.d/README.md
97
109
  - tools/jungle/init.d/puma
@@ -108,7 +120,8 @@ licenses:
108
120
  - BSD-3-Clause
109
121
  metadata:
110
122
  msys2_mingw_dependencies: openssl
111
- post_install_message:
123
+ changelog_uri: https://github.com/puma/puma/blob/master/History.md
124
+ post_install_message:
112
125
  rdoc_options: []
113
126
  require_paths:
114
127
  - lib
@@ -123,9 +136,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
123
136
  - !ruby/object:Gem::Version
124
137
  version: '0'
125
138
  requirements: []
126
- rubyforge_project:
127
- rubygems_version: 2.7.6
128
- signing_key:
139
+ rubygems_version: 3.2.3
140
+ signing_key:
129
141
  specification_version: 4
130
142
  summary: Puma is a simple, fast, threaded, and highly concurrent HTTP 1.1 server for
131
143
  Ruby/Rack applications
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
@@ -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
@@ -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
@@ -1,11 +0,0 @@
1
- module Puma
2
- module Delegation
3
- def forward(what, who)
4
- module_eval <<-CODE
5
- def #{what}(*args, &block)
6
- #{who}.#{what}(*args, &block)
7
- end
8
- CODE
9
- end
10
- end
11
- end
@@ -1,45 +0,0 @@
1
- require 'java'
2
-
3
- # Conservative native JRuby/Java implementation of IOBuffer
4
- # backed by a ByteArrayOutputStream and conversion between
5
- # Ruby String and Java bytes
6
- module Puma
7
- class JavaIOBuffer < java.io.ByteArrayOutputStream
8
- field_reader :buf
9
- end
10
-
11
- class IOBuffer
12
- BUF_DEFAULT_SIZE = 4096
13
-
14
- def initialize
15
- @buf = JavaIOBuffer.new(BUF_DEFAULT_SIZE)
16
- end
17
-
18
- def reset
19
- @buf.reset
20
- end
21
-
22
- def <<(str)
23
- bytes = str.to_java_bytes
24
- @buf.write(bytes, 0, bytes.length)
25
- end
26
-
27
- def append(*strs)
28
- strs.each { |s| self << s; }
29
- end
30
-
31
- def to_s
32
- String.from_java_bytes @buf.to_byte_array
33
- end
34
-
35
- alias_method :to_str, :to_s
36
-
37
- def used
38
- @buf.size
39
- end
40
-
41
- def capacity
42
- @buf.buf.length
43
- end
44
- end
45
- end
@@ -1,33 +0,0 @@
1
- # :stopdoc:
2
-
3
- require 'uri/common'
4
-
5
- # Issue:
6
- # http://bugs.ruby-lang.org/issues/5925
7
- #
8
- # Relevant commit:
9
- # https://github.com/ruby/ruby/commit/edb7cdf1eabaff78dfa5ffedfbc2e91b29fa9ca1
10
-
11
-
12
- module URI
13
- begin
14
- 256.times do |i|
15
- TBLENCWWWCOMP_[i.chr] = '%%%02X' % i
16
- end
17
- TBLENCWWWCOMP_[' '] = '+'
18
- TBLENCWWWCOMP_.freeze
19
-
20
- 256.times do |i|
21
- h, l = i>>4, i&15
22
- TBLDECWWWCOMP_['%%%X%X' % [h, l]] = i.chr
23
- TBLDECWWWCOMP_['%%%x%X' % [h, l]] = i.chr
24
- TBLDECWWWCOMP_['%%%X%x' % [h, l]] = i.chr
25
- TBLDECWWWCOMP_['%%%x%x' % [h, l]] = i.chr
26
- end
27
- TBLDECWWWCOMP_['+'] = ' '
28
- TBLDECWWWCOMP_.freeze
29
- rescue Exception
30
- end
31
- end
32
-
33
- # :startdoc: