puma 3.12.0 → 5.3.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 +1413 -439
- data/LICENSE +23 -20
- data/README.md +131 -60
- data/bin/puma-wild +3 -9
- data/docs/architecture.md +24 -19
- data/docs/compile_options.md +19 -0
- data/docs/deployment.md +38 -13
- data/docs/fork_worker.md +33 -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 +1 -1
- data/docs/plugins.md +20 -10
- data/docs/rails_dev_mode.md +29 -0
- data/docs/restart.md +47 -22
- data/docs/signals.md +7 -6
- data/docs/stats.md +142 -0
- data/docs/systemd.md +48 -70
- data/ext/puma_http11/PumaHttp11Service.java +2 -2
- data/ext/puma_http11/ext_help.h +1 -1
- data/ext/puma_http11/extconf.rb +27 -0
- data/ext/puma_http11/http11_parser.c +84 -109
- data/ext/puma_http11/http11_parser.h +1 -1
- data/ext/puma_http11/http11_parser.java.rl +22 -38
- data/ext/puma_http11/http11_parser.rl +4 -2
- data/ext/puma_http11/http11_parser_common.rl +3 -3
- data/ext/puma_http11/mini_ssl.c +262 -87
- 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 +89 -106
- data/ext/puma_http11/org/jruby/puma/MiniSSL.java +92 -22
- data/ext/puma_http11/puma_http11.c +34 -50
- data/lib/puma/app/status.rb +68 -49
- data/lib/puma/binder.rb +197 -144
- data/lib/puma/cli.rb +17 -15
- data/lib/puma/client.rb +257 -226
- data/lib/puma/cluster/worker.rb +176 -0
- data/lib/puma/cluster/worker_handle.rb +90 -0
- data/lib/puma/cluster.rb +223 -212
- data/lib/puma/commonlogger.rb +4 -2
- data/lib/puma/configuration.rb +58 -51
- data/lib/puma/const.rb +41 -19
- data/lib/puma/control_cli.rb +117 -73
- data/lib/puma/detect.rb +26 -3
- data/lib/puma/dsl.rb +531 -123
- data/lib/puma/error_logger.rb +104 -0
- data/lib/puma/events.rb +57 -31
- data/lib/puma/io_buffer.rb +9 -5
- data/lib/puma/jruby_restart.rb +2 -58
- data/lib/puma/json.rb +96 -0
- data/lib/puma/launcher.rb +182 -70
- data/lib/puma/minissl/context_builder.rb +79 -0
- data/lib/puma/minissl.rb +149 -48
- data/lib/puma/null_io.rb +15 -1
- data/lib/puma/plugin/tmp_restart.rb +2 -0
- data/lib/puma/plugin.rb +8 -12
- data/lib/puma/queue_close.rb +26 -0
- data/lib/puma/rack/builder.rb +4 -5
- data/lib/puma/rack/urlmap.rb +2 -0
- data/lib/puma/rack_default.rb +2 -0
- data/lib/puma/reactor.rb +87 -316
- data/lib/puma/request.rb +456 -0
- data/lib/puma/runner.rb +33 -52
- data/lib/puma/server.rb +288 -679
- data/lib/puma/single.rb +13 -67
- data/lib/puma/state_file.rb +10 -3
- data/lib/puma/systemd.rb +46 -0
- data/lib/puma/thread_pool.rb +131 -81
- data/lib/puma/util.rb +14 -6
- data/lib/puma.rb +54 -0
- data/lib/rack/handler/puma.rb +8 -6
- data/tools/Dockerfile +16 -0
- data/tools/trickletest.rb +0 -1
- metadata +45 -29
- 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/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
|
@@ -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,9 +60,7 @@ 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
|
events = options.delete(:Silent) ? ::Puma::Events.strings : ::Puma::Events.stdio
|
@@ -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
|
|
data/tools/Dockerfile
ADDED
@@ -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,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: puma
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 5.3.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:
|
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
|
@@ -30,14 +44,23 @@ 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
|
42
65
|
- ext/puma_http11/PumaHttp11Service.java
|
43
66
|
- ext/puma_http11/ext_help.h
|
@@ -47,68 +70,62 @@ files:
|
|
47
70
|
- ext/puma_http11/http11_parser.java.rl
|
48
71
|
- ext/puma_http11/http11_parser.rl
|
49
72
|
- ext/puma_http11/http11_parser_common.rl
|
50
|
-
- ext/puma_http11/io_buffer.c
|
51
73
|
- ext/puma_http11/mini_ssl.c
|
74
|
+
- ext/puma_http11/no_ssl/PumaHttp11Service.java
|
52
75
|
- ext/puma_http11/org/jruby/puma/Http11.java
|
53
76
|
- ext/puma_http11/org/jruby/puma/Http11Parser.java
|
54
77
|
- ext/puma_http11/org/jruby/puma/MiniSSL.java
|
55
78
|
- ext/puma_http11/puma_http11.c
|
56
79
|
- lib/puma.rb
|
57
|
-
- lib/puma/accept_nonblock.rb
|
58
80
|
- lib/puma/app/status.rb
|
59
81
|
- lib/puma/binder.rb
|
60
82
|
- lib/puma/cli.rb
|
61
83
|
- lib/puma/client.rb
|
62
84
|
- lib/puma/cluster.rb
|
85
|
+
- lib/puma/cluster/worker.rb
|
86
|
+
- lib/puma/cluster/worker_handle.rb
|
63
87
|
- lib/puma/commonlogger.rb
|
64
|
-
- lib/puma/compat.rb
|
65
88
|
- lib/puma/configuration.rb
|
66
89
|
- lib/puma/const.rb
|
67
90
|
- lib/puma/control_cli.rb
|
68
|
-
- lib/puma/convenient.rb
|
69
|
-
- lib/puma/daemon_ext.rb
|
70
|
-
- lib/puma/delegation.rb
|
71
91
|
- lib/puma/detect.rb
|
72
92
|
- lib/puma/dsl.rb
|
93
|
+
- lib/puma/error_logger.rb
|
73
94
|
- lib/puma/events.rb
|
74
95
|
- lib/puma/io_buffer.rb
|
75
|
-
- lib/puma/java_io_buffer.rb
|
76
96
|
- lib/puma/jruby_restart.rb
|
97
|
+
- lib/puma/json.rb
|
77
98
|
- lib/puma/launcher.rb
|
78
99
|
- lib/puma/minissl.rb
|
100
|
+
- lib/puma/minissl/context_builder.rb
|
79
101
|
- lib/puma/null_io.rb
|
80
102
|
- lib/puma/plugin.rb
|
81
103
|
- lib/puma/plugin/tmp_restart.rb
|
82
|
-
- lib/puma/
|
104
|
+
- lib/puma/queue_close.rb
|
83
105
|
- lib/puma/rack/builder.rb
|
84
106
|
- lib/puma/rack/urlmap.rb
|
85
107
|
- lib/puma/rack_default.rb
|
86
108
|
- lib/puma/reactor.rb
|
109
|
+
- lib/puma/request.rb
|
87
110
|
- lib/puma/runner.rb
|
88
111
|
- lib/puma/server.rb
|
89
112
|
- lib/puma/single.rb
|
90
113
|
- lib/puma/state_file.rb
|
91
|
-
- lib/puma/
|
114
|
+
- lib/puma/systemd.rb
|
92
115
|
- lib/puma/thread_pool.rb
|
93
116
|
- lib/puma/util.rb
|
94
117
|
- 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
|
118
|
+
- tools/Dockerfile
|
105
119
|
- tools/trickletest.rb
|
106
|
-
homepage:
|
120
|
+
homepage: https://puma.io
|
107
121
|
licenses:
|
108
122
|
- BSD-3-Clause
|
109
123
|
metadata:
|
110
|
-
|
111
|
-
|
124
|
+
bug_tracker_uri: https://github.com/puma/puma/issues
|
125
|
+
changelog_uri: https://github.com/puma/puma/blob/master/History.md
|
126
|
+
homepage_uri: https://puma.io
|
127
|
+
source_code_uri: https://github.com/puma/puma
|
128
|
+
post_install_message:
|
112
129
|
rdoc_options: []
|
113
130
|
require_paths:
|
114
131
|
- lib
|
@@ -123,9 +140,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
123
140
|
- !ruby/object:Gem::Version
|
124
141
|
version: '0'
|
125
142
|
requirements: []
|
126
|
-
|
127
|
-
|
128
|
-
signing_key:
|
143
|
+
rubygems_version: 3.2.3
|
144
|
+
signing_key:
|
129
145
|
specification_version: 4
|
130
146
|
summary: Puma is a simple, fast, threaded, and highly concurrent HTTP 1.1 server for
|
131
147
|
Ruby/Rack applications
|
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
|
data/lib/puma/delegation.rb
DELETED
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/lib/puma/tcp_logger.rb
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
module Puma
|
2
|
-
class TCPLogger
|
3
|
-
def initialize(logger, app, quiet=false)
|
4
|
-
@logger = logger
|
5
|
-
@app = app
|
6
|
-
@quiet = quiet
|
7
|
-
end
|
8
|
-
|
9
|
-
FORMAT = "%s - %s"
|
10
|
-
|
11
|
-
def log(who, str)
|
12
|
-
now = Time.now.strftime("%d/%b/%Y %H:%M:%S")
|
13
|
-
|
14
|
-
log_str = "#{now} - #{who} - #{str}"
|
15
|
-
|
16
|
-
case @logger
|
17
|
-
when IO
|
18
|
-
@logger.puts log_str
|
19
|
-
when Events
|
20
|
-
@logger.log log_str
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def call(env, socket)
|
25
|
-
who = env[Const::REMOTE_ADDR]
|
26
|
-
log who, "connected" unless @quiet
|
27
|
-
|
28
|
-
env['log'] = lambda { |str| log(who, str) }
|
29
|
-
|
30
|
-
begin
|
31
|
-
@app.call env, socket
|
32
|
-
rescue Object => e
|
33
|
-
log who, "exception: #{e.message} (#{e.class})"
|
34
|
-
else
|
35
|
-
log who, "disconnected" unless @quiet
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
data/tools/jungle/README.md
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
# Puma as a service
|
2
|
-
|
3
|
-
## Upstart
|
4
|
-
|
5
|
-
See `/tools/jungle/upstart` for Ubuntu's upstart scripts.
|
6
|
-
|
7
|
-
## Systemd
|
8
|
-
|
9
|
-
See [/docs/systemd](https://github.com/puma/puma/blob/master/docs/systemd.md).
|
10
|
-
|
11
|
-
## Init.d
|
12
|
-
|
13
|
-
Deprecatation Warning : `init.d` was replaced by `systemd` since Debian 8 and Ubuntu 16.04, you should look into [/docs/systemd](https://github.com/puma/puma/blob/master/docs/systemd.md) unless you are on an older OS.
|
14
|
-
|
15
|
-
See `/tools/jungle/init.d` for tools to use with init.d and start-stop-daemon.
|
16
|
-
|
17
|
-
## rc.d
|
18
|
-
|
19
|
-
See `/tools/jungle/rc.d` for FreeBSD's rc.d scripts
|
@@ -1,61 +0,0 @@
|
|
1
|
-
# Puma daemon service
|
2
|
-
|
3
|
-
Deprecatation Warning : `init.d` was replaced by `systemd` since Debian 8 and Ubuntu 16.04, you should look into [/docs/systemd](https://github.com/puma/puma/blob/master/docs/systemd.md) unless you are on an older OS.
|
4
|
-
|
5
|
-
Init script to manage multiple Puma servers on the same box using start-stop-daemon.
|
6
|
-
|
7
|
-
## Installation
|
8
|
-
|
9
|
-
# Copy the init script to services directory
|
10
|
-
sudo cp puma /etc/init.d
|
11
|
-
sudo chmod +x /etc/init.d/puma
|
12
|
-
|
13
|
-
# Make it start at boot time.
|
14
|
-
sudo update-rc.d -f puma defaults
|
15
|
-
|
16
|
-
# Copy the Puma runner to an accessible location
|
17
|
-
sudo cp run-puma /usr/local/bin
|
18
|
-
sudo chmod +x /usr/local/bin/run-puma
|
19
|
-
|
20
|
-
# Create an empty configuration file
|
21
|
-
sudo touch /etc/puma.conf
|
22
|
-
|
23
|
-
## Managing the jungle
|
24
|
-
|
25
|
-
Puma apps are held in /etc/puma.conf by default. It's mainly a CSV file and every line represents one app. Here's the syntax:
|
26
|
-
|
27
|
-
app-path,user,config-file-path,log-file-path,environment-variables
|
28
|
-
|
29
|
-
You can add an instance by editing the file or running the following command:
|
30
|
-
|
31
|
-
sudo /etc/init.d/puma add /path/to/app user /path/to/app/config/puma.rb /path/to/app/log/puma.log
|
32
|
-
|
33
|
-
The config and log paths, as well as the environment variables, are optional parameters and default to:
|
34
|
-
|
35
|
-
* config: /path/to/app/*config/puma.rb*
|
36
|
-
* log: /path/to/app/*log/puma.log*
|
37
|
-
* environment: (empty)
|
38
|
-
|
39
|
-
Multiple environment variables need to be separated by a semicolon, e.g.
|
40
|
-
|
41
|
-
FOO=1;BAR=2
|
42
|
-
|
43
|
-
To remove an app, simply delete the line from the config file or run:
|
44
|
-
|
45
|
-
sudo /etc/init.d/puma remove /path/to/app
|
46
|
-
|
47
|
-
The command will make sure the Puma instance stops before removing it from the jungle.
|
48
|
-
|
49
|
-
## Assumptions
|
50
|
-
|
51
|
-
* The script expects a temporary folder named /path/to/app/*tmp/puma* to exist. Create it if it's not there by default.
|
52
|
-
The pid and state files should live there and must be called: *tmp/puma/pid* and *tmp/puma/state*.
|
53
|
-
You can change those if you want but you'll have to adapt the script for it to work.
|
54
|
-
|
55
|
-
* Here's what a minimal app's config file should have:
|
56
|
-
|
57
|
-
```
|
58
|
-
pidfile "/path/to/app/tmp/puma/pid"
|
59
|
-
state_path "/path/to/app/tmp/puma/state"
|
60
|
-
activate_control_app
|
61
|
-
```
|