puma 3.8.2 → 4.0.0
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 +5 -5
- data/History.md +157 -0
- data/README.md +155 -225
- data/docs/architecture.md +37 -0
- data/{DEPLOYMENT.md → docs/deployment.md} +24 -4
- 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/plugins.md +28 -0
- data/docs/restart.md +41 -0
- data/docs/signals.md +56 -3
- data/docs/systemd.md +130 -37
- data/ext/puma_http11/PumaHttp11Service.java +2 -0
- data/ext/puma_http11/http11_parser.c +84 -84
- data/ext/puma_http11/http11_parser.rl +9 -9
- data/ext/puma_http11/mini_ssl.c +51 -9
- data/ext/puma_http11/org/jruby/puma/Http11Parser.java +13 -16
- data/ext/puma_http11/org/jruby/puma/IOBuffer.java +72 -0
- data/ext/puma_http11/org/jruby/puma/MiniSSL.java +26 -6
- data/lib/puma.rb +8 -0
- data/lib/puma/app/status.rb +9 -0
- data/lib/puma/binder.rb +31 -18
- data/lib/puma/cli.rb +22 -7
- data/lib/puma/client.rb +67 -18
- data/lib/puma/cluster.rb +64 -19
- data/lib/puma/commonlogger.rb +2 -0
- data/lib/puma/configuration.rb +22 -14
- data/lib/puma/const.rb +13 -2
- data/lib/puma/control_cli.rb +26 -14
- data/lib/puma/convenient.rb +2 -0
- data/lib/puma/daemon_ext.rb +2 -0
- data/lib/puma/delegation.rb +2 -0
- data/lib/puma/detect.rb +2 -0
- data/lib/puma/dsl.rb +91 -12
- data/lib/puma/events.rb +3 -2
- data/lib/puma/io_buffer.rb +3 -6
- data/lib/puma/jruby_restart.rb +2 -1
- data/lib/puma/launcher.rb +51 -30
- data/lib/puma/minissl.rb +79 -28
- data/lib/puma/null_io.rb +2 -0
- data/lib/puma/plugin.rb +2 -0
- data/lib/puma/plugin/tmp_restart.rb +0 -1
- data/lib/puma/rack/builder.rb +2 -1
- data/lib/puma/reactor.rb +218 -30
- data/lib/puma/runner.rb +17 -4
- data/lib/puma/server.rb +113 -49
- data/lib/puma/single.rb +16 -5
- data/lib/puma/state_file.rb +2 -0
- data/lib/puma/tcp_logger.rb +2 -0
- data/lib/puma/thread_pool.rb +59 -6
- data/lib/puma/util.rb +2 -6
- data/lib/rack/handler/puma.rb +13 -2
- data/tools/jungle/README.md +12 -2
- data/tools/jungle/init.d/README.md +2 -0
- data/tools/jungle/init.d/puma +7 -7
- data/tools/jungle/init.d/run-puma +1 -1
- data/tools/jungle/rc.d/README.md +74 -0
- data/tools/jungle/rc.d/puma +61 -0
- data/tools/jungle/rc.d/puma.conf +10 -0
- data/tools/trickletest.rb +1 -1
- metadata +25 -87
- data/.github/issue_template.md +0 -20
- data/Gemfile +0 -12
- data/Manifest.txt +0 -78
- data/Rakefile +0 -158
- data/Release.md +0 -9
- data/gemfiles/2.1-Gemfile +0 -12
- data/lib/puma/compat.rb +0 -14
- data/lib/puma/java_io_buffer.rb +0 -45
- data/lib/puma/rack/backports/uri/common_193.rb +0 -33
- data/puma.gemspec +0 -52
data/.github/issue_template.md
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
### Steps to reproduce
|
2
|
-
|
3
|
-
1) ...
|
4
|
-
|
5
|
-
2) ...
|
6
|
-
|
7
|
-
3) ...
|
8
|
-
|
9
|
-
### Expected behavior
|
10
|
-
|
11
|
-
Tell us what should happen ...
|
12
|
-
|
13
|
-
### Actual behavior
|
14
|
-
|
15
|
-
Tell us what happens instead ...
|
16
|
-
|
17
|
-
### System configuration
|
18
|
-
|
19
|
-
**Ruby version**:
|
20
|
-
**Rails version**:
|
data/Gemfile
DELETED
data/Manifest.txt
DELETED
@@ -1,78 +0,0 @@
|
|
1
|
-
.github/issue_template.md
|
2
|
-
DEPLOYMENT.md
|
3
|
-
Gemfile
|
4
|
-
History.md
|
5
|
-
LICENSE
|
6
|
-
Manifest.txt
|
7
|
-
README.md
|
8
|
-
Rakefile
|
9
|
-
Release.md
|
10
|
-
bin/puma
|
11
|
-
bin/puma-wild
|
12
|
-
bin/pumactl
|
13
|
-
docs/nginx.md
|
14
|
-
docs/signals.md
|
15
|
-
docs/systemd.md
|
16
|
-
ext/puma_http11/PumaHttp11Service.java
|
17
|
-
ext/puma_http11/ext_help.h
|
18
|
-
ext/puma_http11/extconf.rb
|
19
|
-
ext/puma_http11/http11_parser.c
|
20
|
-
ext/puma_http11/http11_parser.h
|
21
|
-
ext/puma_http11/http11_parser.java.rl
|
22
|
-
ext/puma_http11/http11_parser.rl
|
23
|
-
ext/puma_http11/http11_parser_common.rl
|
24
|
-
ext/puma_http11/io_buffer.c
|
25
|
-
ext/puma_http11/mini_ssl.c
|
26
|
-
ext/puma_http11/org/jruby/puma/Http11.java
|
27
|
-
ext/puma_http11/org/jruby/puma/Http11Parser.java
|
28
|
-
ext/puma_http11/org/jruby/puma/MiniSSL.java
|
29
|
-
ext/puma_http11/puma_http11.c
|
30
|
-
gemfiles/2.1-Gemfile
|
31
|
-
lib/puma.rb
|
32
|
-
lib/puma/accept_nonblock.rb
|
33
|
-
lib/puma/app/status.rb
|
34
|
-
lib/puma/binder.rb
|
35
|
-
lib/puma/cli.rb
|
36
|
-
lib/puma/client.rb
|
37
|
-
lib/puma/cluster.rb
|
38
|
-
lib/puma/commonlogger.rb
|
39
|
-
lib/puma/compat.rb
|
40
|
-
lib/puma/configuration.rb
|
41
|
-
lib/puma/const.rb
|
42
|
-
lib/puma/control_cli.rb
|
43
|
-
lib/puma/convenient.rb
|
44
|
-
lib/puma/daemon_ext.rb
|
45
|
-
lib/puma/delegation.rb
|
46
|
-
lib/puma/detect.rb
|
47
|
-
lib/puma/dsl.rb
|
48
|
-
lib/puma/events.rb
|
49
|
-
lib/puma/io_buffer.rb
|
50
|
-
lib/puma/java_io_buffer.rb
|
51
|
-
lib/puma/jruby_restart.rb
|
52
|
-
lib/puma/launcher.rb
|
53
|
-
lib/puma/minissl.rb
|
54
|
-
lib/puma/null_io.rb
|
55
|
-
lib/puma/plugin.rb
|
56
|
-
lib/puma/plugin/tmp_restart.rb
|
57
|
-
lib/puma/rack/backports/uri/common_193.rb
|
58
|
-
lib/puma/rack/builder.rb
|
59
|
-
lib/puma/rack/urlmap.rb
|
60
|
-
lib/puma/rack_default.rb
|
61
|
-
lib/puma/reactor.rb
|
62
|
-
lib/puma/runner.rb
|
63
|
-
lib/puma/server.rb
|
64
|
-
lib/puma/single.rb
|
65
|
-
lib/puma/state_file.rb
|
66
|
-
lib/puma/tcp_logger.rb
|
67
|
-
lib/puma/thread_pool.rb
|
68
|
-
lib/puma/util.rb
|
69
|
-
lib/rack/handler/puma.rb
|
70
|
-
puma.gemspec
|
71
|
-
tools/jungle/README.md
|
72
|
-
tools/jungle/init.d/README.md
|
73
|
-
tools/jungle/init.d/puma
|
74
|
-
tools/jungle/init.d/run-puma
|
75
|
-
tools/jungle/upstart/README.md
|
76
|
-
tools/jungle/upstart/puma-manager.conf
|
77
|
-
tools/jungle/upstart/puma.conf
|
78
|
-
tools/trickletest.rb
|
data/Rakefile
DELETED
@@ -1,158 +0,0 @@
|
|
1
|
-
require "bundler/setup"
|
2
|
-
require "hoe"
|
3
|
-
require "rake/extensiontask"
|
4
|
-
require "rake/javaextensiontask"
|
5
|
-
|
6
|
-
IS_JRUBY = defined?(RUBY_ENGINE) ? RUBY_ENGINE == "jruby" : false
|
7
|
-
|
8
|
-
Hoe.plugin :git
|
9
|
-
Hoe.plugin :ignore
|
10
|
-
|
11
|
-
HOE = Hoe.spec "puma" do
|
12
|
-
self.readme_file = "README.md"
|
13
|
-
self.urls = %w!http://puma.io https://github.com/puma/puma!
|
14
|
-
|
15
|
-
license "BSD-3-Clause"
|
16
|
-
developer 'Evan Phoenix', 'evan@phx.io'
|
17
|
-
|
18
|
-
spec_extras[:extensions] = ["ext/puma_http11/extconf.rb"]
|
19
|
-
spec_extras[:executables] = ['puma', 'pumactl']
|
20
|
-
spec_extras[:homepage] = self.urls.first
|
21
|
-
|
22
|
-
require_ruby_version ">= 1.9.3"
|
23
|
-
|
24
|
-
dependency "rack", [">= 1.1", "< 3.0"], :development
|
25
|
-
|
26
|
-
extra_dev_deps << ["rake-compiler", "~> 0.8"]
|
27
|
-
end
|
28
|
-
|
29
|
-
task :prerelease => [:clobber, :check_manifest, :test]
|
30
|
-
|
31
|
-
# hoe/test and rake-compiler don't seem to play well together, so disable
|
32
|
-
# hoe/test's .gemtest touch file thingy for now
|
33
|
-
HOE.spec.files -= [".gemtest"]
|
34
|
-
|
35
|
-
include Hoe::Git
|
36
|
-
|
37
|
-
desc "Print the current changelog."
|
38
|
-
task "changelog" do
|
39
|
-
tag = ENV["FROM"] || git_tags.last
|
40
|
-
range = [tag, "HEAD"].compact.join ".."
|
41
|
-
cmd = "git log #{range} '--format=tformat:%B|||%aN|||%aE|||'"
|
42
|
-
now = Time.new.strftime "%Y-%m-%d"
|
43
|
-
|
44
|
-
changes = `#{cmd}`.split(/\|\|\|/).each_slice(3).map { |msg, author, email|
|
45
|
-
msg.split(/\n/).reject { |s| s.empty? }.first
|
46
|
-
}.flatten.compact
|
47
|
-
|
48
|
-
$changes = Hash.new { |h,k| h[k] = [] }
|
49
|
-
|
50
|
-
codes = {
|
51
|
-
"!" => :major,
|
52
|
-
"+" => :minor,
|
53
|
-
"*" => :minor,
|
54
|
-
"-" => :bug,
|
55
|
-
"?" => :unknown,
|
56
|
-
}
|
57
|
-
|
58
|
-
codes_re = Regexp.escape codes.keys.join
|
59
|
-
|
60
|
-
changes.each do |change|
|
61
|
-
if change =~ /^\s*([#{codes_re}])\s*(.*)/ then
|
62
|
-
code, line = codes[$1], $2
|
63
|
-
else
|
64
|
-
code, line = codes["?"], change.chomp
|
65
|
-
end
|
66
|
-
|
67
|
-
$changes[code] << line
|
68
|
-
end
|
69
|
-
|
70
|
-
puts "## #{ENV['VERSION'] || 'NEXT'} / #{now}"
|
71
|
-
puts
|
72
|
-
changelog_section :major
|
73
|
-
changelog_section :minor
|
74
|
-
changelog_section :bug
|
75
|
-
changelog_section :unknown
|
76
|
-
puts
|
77
|
-
end
|
78
|
-
|
79
|
-
# generate extension code using Ragel (C and Java)
|
80
|
-
desc "Generate extension code (C and Java) using Ragel"
|
81
|
-
task :ragel
|
82
|
-
|
83
|
-
file 'ext/puma_http11/http11_parser.c' => ['ext/puma_http11/http11_parser.rl'] do |t|
|
84
|
-
begin
|
85
|
-
sh "ragel #{t.prerequisites.last} -C -G2 -I ext/puma_http11 -o #{t.name}"
|
86
|
-
rescue
|
87
|
-
fail "Could not build wrapper using Ragel (it failed or not installed?)"
|
88
|
-
end
|
89
|
-
end
|
90
|
-
task :ragel => ['ext/puma_http11/http11_parser.c']
|
91
|
-
|
92
|
-
file 'ext/puma_http11/org/jruby/puma/Http11Parser.java' => ['ext/puma_http11/http11_parser.java.rl'] do |t|
|
93
|
-
begin
|
94
|
-
sh "ragel #{t.prerequisites.last} -J -G2 -I ext/puma_http11 -o #{t.name}"
|
95
|
-
rescue
|
96
|
-
fail "Could not build wrapper using Ragel (it failed or not installed?)"
|
97
|
-
end
|
98
|
-
end
|
99
|
-
task :ragel => ['ext/puma_http11/org/jruby/puma/Http11Parser.java']
|
100
|
-
|
101
|
-
if !IS_JRUBY
|
102
|
-
|
103
|
-
# compile extensions using rake-compiler
|
104
|
-
# C (MRI, Rubinius)
|
105
|
-
Rake::ExtensionTask.new("puma_http11", HOE.spec) do |ext|
|
106
|
-
# place extension inside namespace
|
107
|
-
ext.lib_dir = "lib/puma"
|
108
|
-
|
109
|
-
ext.cross_compile = true
|
110
|
-
ext.cross_platform = ['i386-mswin32-60', 'i386-mingw32']
|
111
|
-
ext.cross_compiling do |spec|
|
112
|
-
# add fat-binary stub only when cross compiling
|
113
|
-
spec.files << "lib/puma/puma_http11.rb"
|
114
|
-
end
|
115
|
-
|
116
|
-
CLEAN.include "lib/puma/{1.8,1.9}"
|
117
|
-
CLEAN.include "lib/puma/puma_http11.rb"
|
118
|
-
end
|
119
|
-
|
120
|
-
else
|
121
|
-
|
122
|
-
# Java (JRuby)
|
123
|
-
Rake::JavaExtensionTask.new("puma_http11", HOE.spec) do |ext|
|
124
|
-
ext.lib_dir = "lib/puma"
|
125
|
-
end
|
126
|
-
|
127
|
-
end
|
128
|
-
|
129
|
-
# the following is a fat-binary stub that will be used when
|
130
|
-
# require 'puma/puma_http11' and will use either 1.8 or 1.9 version depending
|
131
|
-
# on RUBY_VERSION
|
132
|
-
file "lib/puma/puma_http11.rb" do |t|
|
133
|
-
File.open(t.name, "w") do |f|
|
134
|
-
f.puts "RUBY_VERSION =~ /(\d+.\d+)/"
|
135
|
-
f.puts 'require "puma/#{$1}/puma_http11"'
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
# tests require extension be compiled, but depend on the platform
|
140
|
-
if IS_JRUBY
|
141
|
-
task :test => [:java]
|
142
|
-
else
|
143
|
-
task :test => [:compile]
|
144
|
-
end
|
145
|
-
|
146
|
-
namespace :test do
|
147
|
-
desc "Run the integration tests"
|
148
|
-
task :integration do
|
149
|
-
sh "cd test/shell; sh run.sh"
|
150
|
-
end
|
151
|
-
|
152
|
-
desc "Run all tests"
|
153
|
-
if defined?(JRUBY_VERSION) and ENV['TRAVIS']
|
154
|
-
task :all => :test
|
155
|
-
else
|
156
|
-
task :all => [:test, "test:integration"]
|
157
|
-
end
|
158
|
-
end
|
data/Release.md
DELETED
data/gemfiles/2.1-Gemfile
DELETED
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/java_io_buffer.rb
DELETED
@@ -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:
|
data/puma.gemspec
DELETED
@@ -1,52 +0,0 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
|
-
|
3
|
-
# This is only used when puma is a git dep from Bundler, so it's a little
|
4
|
-
# weird.
|
5
|
-
|
6
|
-
d = File.read(File.expand_path("../lib/puma/const.rb", __FILE__))
|
7
|
-
if d =~ /VERSION = "(\d+\.\d+\.\d+)"/
|
8
|
-
version = $1
|
9
|
-
else
|
10
|
-
version = "0.0.1"
|
11
|
-
end
|
12
|
-
|
13
|
-
Gem::Specification.new do |s|
|
14
|
-
s.name = "puma"
|
15
|
-
s.version = version
|
16
|
-
|
17
|
-
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
18
|
-
s.authors = ["Evan Phoenix"]
|
19
|
-
s.date = `git log --pretty="%ai" -n 1`.split(" ").first
|
20
|
-
s.description = "Puma is a simple, fast, threaded, and highly concurrent HTTP 1.1 server for Ruby/Rack applications. Puma is intended for use in both development and production environments. It's great for highly concurrent Ruby implementations such as Rubinius and JRuby as well as as providing process worker support to support CRuby well."
|
21
|
-
s.email = ["evan@phx.io"]
|
22
|
-
s.executables = ["puma", "pumactl"]
|
23
|
-
s.extensions = ["ext/puma_http11/extconf.rb"]
|
24
|
-
s.files = `git ls-files`.split($/)
|
25
|
-
s.homepage = "http://puma.io"
|
26
|
-
s.license = "BSD-3-Clause"
|
27
|
-
s.rdoc_options = ["--main", "README.md"]
|
28
|
-
s.require_paths = ["lib"]
|
29
|
-
s.required_ruby_version = Gem::Requirement.new(">= 1.9.3")
|
30
|
-
s.rubyforge_project = "puma"
|
31
|
-
s.rubygems_version = "1.8.25"
|
32
|
-
s.summary = "Puma is a simple, fast, threaded, and highly concurrent HTTP 1.1 server for Ruby/Rack applications"
|
33
|
-
s.test_files = s.files.grep(/^test/)
|
34
|
-
|
35
|
-
if s.respond_to? :specification_version then
|
36
|
-
s.specification_version = 3
|
37
|
-
|
38
|
-
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
39
|
-
s.add_development_dependency(%q<rdoc>, ["~> 4.0"])
|
40
|
-
s.add_development_dependency(%q<rake-compiler>, ["~> 0.8.0"])
|
41
|
-
s.add_development_dependency(%q<hoe>, ["~> 3.6"])
|
42
|
-
else
|
43
|
-
s.add_dependency(%q<rdoc>, ["~> 4.0"])
|
44
|
-
s.add_dependency(%q<rake-compiler>, ["~> 0.8.0"])
|
45
|
-
s.add_dependency(%q<hoe>, ["~> 3.6"])
|
46
|
-
end
|
47
|
-
else
|
48
|
-
s.add_dependency(%q<rdoc>, ["~> 4.0"])
|
49
|
-
s.add_dependency(%q<rake-compiler>, ["~> 0.8.0"])
|
50
|
-
s.add_dependency(%q<hoe>, ["~> 3.6"])
|
51
|
-
end
|
52
|
-
end
|