puma 4.3.12 → 5.6.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.md +1526 -524
- data/LICENSE +23 -20
- data/README.md +120 -36
- data/bin/puma-wild +3 -9
- data/docs/architecture.md +63 -26
- data/docs/compile_options.md +21 -0
- data/docs/deployment.md +60 -69
- data/docs/fork_worker.md +33 -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 +1 -1
- data/docs/plugins.md +15 -15
- data/docs/rails_dev_mode.md +28 -0
- data/docs/restart.md +46 -23
- data/docs/signals.md +13 -11
- data/docs/stats.md +142 -0
- data/docs/systemd.md +85 -128
- data/ext/puma_http11/PumaHttp11Service.java +2 -4
- data/ext/puma_http11/ext_help.h +1 -1
- data/ext/puma_http11/extconf.rb +44 -10
- data/ext/puma_http11/http11_parser.c +45 -47
- data/ext/puma_http11/http11_parser.h +1 -1
- data/ext/puma_http11/http11_parser.java.rl +1 -1
- data/ext/puma_http11/http11_parser.rl +1 -1
- data/ext/puma_http11/http11_parser_common.rl +0 -0
- data/ext/puma_http11/mini_ssl.c +225 -89
- data/ext/puma_http11/no_ssl/PumaHttp11Service.java +15 -0
- data/ext/puma_http11/org/jruby/puma/Http11.java +5 -3
- data/ext/puma_http11/org/jruby/puma/Http11Parser.java +3 -5
- data/ext/puma_http11/org/jruby/puma/MiniSSL.java +109 -67
- data/ext/puma_http11/puma_http11.c +32 -51
- data/lib/puma/app/status.rb +50 -36
- data/lib/puma/binder.rb +225 -106
- data/lib/puma/cli.rb +24 -18
- data/lib/puma/client.rb +146 -84
- data/lib/puma/cluster/worker.rb +173 -0
- data/lib/puma/cluster/worker_handle.rb +94 -0
- data/lib/puma/cluster.rb +212 -220
- data/lib/puma/commonlogger.rb +2 -2
- data/lib/puma/configuration.rb +58 -49
- data/lib/puma/const.rb +22 -7
- data/lib/puma/control_cli.rb +99 -76
- data/lib/puma/detect.rb +29 -2
- data/lib/puma/dsl.rb +368 -96
- data/lib/puma/error_logger.rb +104 -0
- data/lib/puma/events.rb +55 -34
- data/lib/puma/io_buffer.rb +9 -2
- data/lib/puma/jruby_restart.rb +0 -58
- data/lib/puma/json_serialization.rb +96 -0
- data/lib/puma/launcher.rb +128 -46
- data/lib/puma/minissl/context_builder.rb +14 -9
- data/lib/puma/minissl.rb +137 -50
- data/lib/puma/null_io.rb +18 -1
- data/lib/puma/plugin/tmp_restart.rb +0 -0
- data/lib/puma/plugin.rb +3 -12
- data/lib/puma/queue_close.rb +26 -0
- data/lib/puma/rack/builder.rb +1 -5
- data/lib/puma/rack/urlmap.rb +0 -0
- data/lib/puma/rack_default.rb +0 -0
- data/lib/puma/reactor.rb +85 -369
- data/lib/puma/request.rb +489 -0
- data/lib/puma/runner.rb +46 -61
- data/lib/puma/server.rb +292 -763
- data/lib/puma/single.rb +9 -65
- data/lib/puma/state_file.rb +48 -8
- data/lib/puma/systemd.rb +46 -0
- data/lib/puma/thread_pool.rb +125 -57
- data/lib/puma/util.rb +32 -4
- data/lib/puma.rb +48 -0
- data/lib/rack/handler/puma.rb +2 -3
- data/lib/rack/version_restriction.rb +15 -0
- data/tools/{docker/Dockerfile → Dockerfile} +1 -1
- data/tools/trickletest.rb +0 -0
- metadata +29 -24
- data/docs/tcp_mode.md +0 -96
- data/ext/puma_http11/io_buffer.c +0 -155
- data/ext/puma_http11/org/jruby/puma/IOBuffer.java +0 -72
- data/lib/puma/accept_nonblock.rb +0 -29
- data/lib/puma/tcp_logger.rb +0 -41
- 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
@@ -30,9 +30,8 @@ module Rack
|
|
30
30
|
end
|
31
31
|
|
32
32
|
conf = ::Puma::Configuration.new(options, default_options) do |user_config, file_config, default_config|
|
33
|
-
user_config.quiet
|
34
|
-
|
35
33
|
if options.delete(:Verbose)
|
34
|
+
require 'rack/common_logger'
|
36
35
|
app = Rack::CommonLogger.new(app, STDOUT)
|
37
36
|
end
|
38
37
|
|
@@ -61,7 +60,7 @@ module Rack
|
|
61
60
|
conf
|
62
61
|
end
|
63
62
|
|
64
|
-
def self.run(app, options
|
63
|
+
def self.run(app, **options)
|
65
64
|
conf = self.config(app, options)
|
66
65
|
|
67
66
|
events = options.delete(:Silent) ? ::Puma::Events.strings : ::Puma::Events.stdio
|
@@ -0,0 +1,15 @@
|
|
1
|
+
begin
|
2
|
+
begin
|
3
|
+
# rack/version exists in Rack 2.2.0 and later, compatible with Ruby 2.3 and later
|
4
|
+
# we prefer to not load Rack
|
5
|
+
require 'rack/version'
|
6
|
+
rescue LoadError
|
7
|
+
require 'rack'
|
8
|
+
end
|
9
|
+
|
10
|
+
# Rack.release is needed for Rack v1, Rack::RELEASE was added in v2
|
11
|
+
if Gem::Version.new(Rack.release) >= Gem::Version.new("3.0.0")
|
12
|
+
raise StandardError.new "Puma 5 is not compatible with Rack 3, please upgrade to Puma 6 or higher."
|
13
|
+
end
|
14
|
+
rescue LoadError
|
15
|
+
end
|
data/tools/trickletest.rb
CHANGED
File without changes
|
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
|
+
version: 5.6.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Evan Phoenix
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-09-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nio4r
|
@@ -24,9 +24,9 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '2.0'
|
27
|
-
description: Puma is a simple, fast, threaded, and highly
|
27
|
+
description: Puma is a simple, fast, threaded, and highly parallel HTTP 1.1 server
|
28
28
|
for Ruby/Rack applications. Puma is intended for use in both development and production
|
29
|
-
environments. It's great for highly
|
29
|
+
environments. It's great for highly parallel Ruby implementations such as Rubinius
|
30
30
|
and JRuby as well as as providing process worker support to support CRuby well.
|
31
31
|
email:
|
32
32
|
- evan@phx.io
|
@@ -44,16 +44,24 @@ files:
|
|
44
44
|
- bin/puma-wild
|
45
45
|
- bin/pumactl
|
46
46
|
- docs/architecture.md
|
47
|
+
- docs/compile_options.md
|
47
48
|
- docs/deployment.md
|
49
|
+
- docs/fork_worker.md
|
48
50
|
- docs/images/puma-connection-flow-no-reactor.png
|
49
51
|
- docs/images/puma-connection-flow.png
|
50
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
|
51
58
|
- docs/nginx.md
|
52
59
|
- docs/plugins.md
|
60
|
+
- docs/rails_dev_mode.md
|
53
61
|
- docs/restart.md
|
54
62
|
- docs/signals.md
|
63
|
+
- docs/stats.md
|
55
64
|
- docs/systemd.md
|
56
|
-
- docs/tcp_mode.md
|
57
65
|
- ext/puma_http11/PumaHttp11Service.java
|
58
66
|
- ext/puma_http11/ext_help.h
|
59
67
|
- ext/puma_http11/extconf.rb
|
@@ -62,65 +70,62 @@ files:
|
|
62
70
|
- ext/puma_http11/http11_parser.java.rl
|
63
71
|
- ext/puma_http11/http11_parser.rl
|
64
72
|
- ext/puma_http11/http11_parser_common.rl
|
65
|
-
- ext/puma_http11/io_buffer.c
|
66
73
|
- ext/puma_http11/mini_ssl.c
|
74
|
+
- ext/puma_http11/no_ssl/PumaHttp11Service.java
|
67
75
|
- ext/puma_http11/org/jruby/puma/Http11.java
|
68
76
|
- ext/puma_http11/org/jruby/puma/Http11Parser.java
|
69
|
-
- ext/puma_http11/org/jruby/puma/IOBuffer.java
|
70
77
|
- ext/puma_http11/org/jruby/puma/MiniSSL.java
|
71
78
|
- ext/puma_http11/puma_http11.c
|
72
79
|
- lib/puma.rb
|
73
|
-
- lib/puma/accept_nonblock.rb
|
74
80
|
- lib/puma/app/status.rb
|
75
81
|
- lib/puma/binder.rb
|
76
82
|
- lib/puma/cli.rb
|
77
83
|
- lib/puma/client.rb
|
78
84
|
- lib/puma/cluster.rb
|
85
|
+
- lib/puma/cluster/worker.rb
|
86
|
+
- lib/puma/cluster/worker_handle.rb
|
79
87
|
- lib/puma/commonlogger.rb
|
80
88
|
- lib/puma/configuration.rb
|
81
89
|
- lib/puma/const.rb
|
82
90
|
- lib/puma/control_cli.rb
|
83
91
|
- lib/puma/detect.rb
|
84
92
|
- lib/puma/dsl.rb
|
93
|
+
- lib/puma/error_logger.rb
|
85
94
|
- lib/puma/events.rb
|
86
95
|
- lib/puma/io_buffer.rb
|
87
96
|
- lib/puma/jruby_restart.rb
|
97
|
+
- lib/puma/json_serialization.rb
|
88
98
|
- lib/puma/launcher.rb
|
89
99
|
- lib/puma/minissl.rb
|
90
100
|
- lib/puma/minissl/context_builder.rb
|
91
101
|
- lib/puma/null_io.rb
|
92
102
|
- lib/puma/plugin.rb
|
93
103
|
- lib/puma/plugin/tmp_restart.rb
|
104
|
+
- lib/puma/queue_close.rb
|
94
105
|
- lib/puma/rack/builder.rb
|
95
106
|
- lib/puma/rack/urlmap.rb
|
96
107
|
- lib/puma/rack_default.rb
|
97
108
|
- lib/puma/reactor.rb
|
109
|
+
- lib/puma/request.rb
|
98
110
|
- lib/puma/runner.rb
|
99
111
|
- lib/puma/server.rb
|
100
112
|
- lib/puma/single.rb
|
101
113
|
- lib/puma/state_file.rb
|
102
|
-
- lib/puma/
|
114
|
+
- lib/puma/systemd.rb
|
103
115
|
- lib/puma/thread_pool.rb
|
104
116
|
- lib/puma/util.rb
|
105
117
|
- lib/rack/handler/puma.rb
|
106
|
-
-
|
107
|
-
- tools/
|
108
|
-
- tools/jungle/init.d/README.md
|
109
|
-
- tools/jungle/init.d/puma
|
110
|
-
- tools/jungle/init.d/run-puma
|
111
|
-
- tools/jungle/rc.d/README.md
|
112
|
-
- tools/jungle/rc.d/puma
|
113
|
-
- tools/jungle/rc.d/puma.conf
|
114
|
-
- tools/jungle/upstart/README.md
|
115
|
-
- tools/jungle/upstart/puma-manager.conf
|
116
|
-
- tools/jungle/upstart/puma.conf
|
118
|
+
- lib/rack/version_restriction.rb
|
119
|
+
- tools/Dockerfile
|
117
120
|
- tools/trickletest.rb
|
118
|
-
homepage:
|
121
|
+
homepage: https://puma.io
|
119
122
|
licenses:
|
120
123
|
- BSD-3-Clause
|
121
124
|
metadata:
|
122
|
-
|
125
|
+
bug_tracker_uri: https://github.com/puma/puma/issues
|
123
126
|
changelog_uri: https://github.com/puma/puma/blob/master/History.md
|
127
|
+
homepage_uri: https://puma.io
|
128
|
+
source_code_uri: https://github.com/puma/puma
|
124
129
|
post_install_message:
|
125
130
|
rdoc_options: []
|
126
131
|
require_paths:
|
@@ -136,9 +141,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
136
141
|
- !ruby/object:Gem::Version
|
137
142
|
version: '0'
|
138
143
|
requirements: []
|
139
|
-
rubygems_version: 3.
|
144
|
+
rubygems_version: 3.5.16
|
140
145
|
signing_key:
|
141
146
|
specification_version: 4
|
142
|
-
summary: Puma is a simple, fast, threaded, and highly
|
147
|
+
summary: Puma is a simple, fast, threaded, and highly parallel HTTP 1.1 server for
|
143
148
|
Ruby/Rack applications
|
144
149
|
test_files: []
|
data/docs/tcp_mode.md
DELETED
@@ -1,96 +0,0 @@
|
|
1
|
-
# TCP mode
|
2
|
-
|
3
|
-
Puma also could be used as a TCP server to process incoming TCP
|
4
|
-
connections.
|
5
|
-
|
6
|
-
|
7
|
-
## Configuration
|
8
|
-
|
9
|
-
TCP mode can be enabled with CLI option `--tcp-mode`:
|
10
|
-
|
11
|
-
```
|
12
|
-
$ puma --tcp-mode
|
13
|
-
```
|
14
|
-
|
15
|
-
Default ip and port to listen to are `0.0.0.0` and `9292`. You can configure
|
16
|
-
them with `--port` and `--bind` options:
|
17
|
-
|
18
|
-
```
|
19
|
-
$ puma --tcp-mode --bind tcp://127.0.0.1:9293
|
20
|
-
$ puma --tcp-mode --port 9293
|
21
|
-
```
|
22
|
-
|
23
|
-
TCP mode could be set with a configuration file as well with `tcp_mode`
|
24
|
-
and `tcp_mode!` methods:
|
25
|
-
|
26
|
-
```
|
27
|
-
# config/puma.rb
|
28
|
-
tcp_mode
|
29
|
-
```
|
30
|
-
|
31
|
-
When Puma starts in the TCP mode it prints the corresponding message:
|
32
|
-
|
33
|
-
```
|
34
|
-
puma --tcp-mode
|
35
|
-
Puma starting in single mode...
|
36
|
-
...
|
37
|
-
* Mode: Lopez Express (tcp)
|
38
|
-
```
|
39
|
-
|
40
|
-
|
41
|
-
## How to declare an application
|
42
|
-
|
43
|
-
An application to process TCP connections should be declared as a
|
44
|
-
callable object which accepts `env` and `socket` arguments.
|
45
|
-
|
46
|
-
`env` argument is a Hash with following structure:
|
47
|
-
|
48
|
-
```ruby
|
49
|
-
{ "thread" => {}, "REMOTE_ADDR" => "127.0.0.1:51133", "log" => "#<Proc:0x000..." }
|
50
|
-
```
|
51
|
-
|
52
|
-
It consists of:
|
53
|
-
* `thread` - a Hash for each thread in the thread pool that could be
|
54
|
-
used to store information between requests
|
55
|
-
* `REMOTE_ADDR` - a client ip address
|
56
|
-
* `log` - a proc object to write something down
|
57
|
-
|
58
|
-
`log` object could be used this way:
|
59
|
-
|
60
|
-
```ruby
|
61
|
-
env['log'].call('message to log')
|
62
|
-
#> 19/Oct/2019 20:28:53 - 127.0.0.1:51266 - message to log
|
63
|
-
```
|
64
|
-
|
65
|
-
|
66
|
-
## Example of an application
|
67
|
-
|
68
|
-
Let's look at an example of a simple application which just echoes
|
69
|
-
incoming string:
|
70
|
-
|
71
|
-
```ruby
|
72
|
-
# config/puma.rb
|
73
|
-
app do |env, socket|
|
74
|
-
s = socket.gets
|
75
|
-
socket.puts "Echo #{s}"
|
76
|
-
end
|
77
|
-
```
|
78
|
-
|
79
|
-
We can easily access the TCP server with `telnet` command and receive an
|
80
|
-
echo:
|
81
|
-
|
82
|
-
```shell
|
83
|
-
telnet 0.0.0.0 9293
|
84
|
-
Trying 0.0.0.0...
|
85
|
-
Connected to 0.0.0.0.
|
86
|
-
Escape character is '^]'.
|
87
|
-
sssss
|
88
|
-
Echo sssss
|
89
|
-
^CConnection closed by foreign host.
|
90
|
-
```
|
91
|
-
|
92
|
-
|
93
|
-
## Socket management
|
94
|
-
|
95
|
-
After the application finishes, Puma closes the socket. In order to
|
96
|
-
prevent this, the application should set `env['detach'] = true`.
|
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
|
-
}
|
@@ -1,72 +0,0 @@
|
|
1
|
-
package org.jruby.puma;
|
2
|
-
|
3
|
-
import org.jruby.*;
|
4
|
-
import org.jruby.anno.JRubyMethod;
|
5
|
-
import org.jruby.runtime.ObjectAllocator;
|
6
|
-
import org.jruby.runtime.ThreadContext;
|
7
|
-
import org.jruby.runtime.builtin.IRubyObject;
|
8
|
-
import org.jruby.util.ByteList;
|
9
|
-
|
10
|
-
/**
|
11
|
-
* @author kares
|
12
|
-
*/
|
13
|
-
public class IOBuffer extends RubyObject {
|
14
|
-
|
15
|
-
private static final ObjectAllocator ALLOCATOR = new ObjectAllocator() {
|
16
|
-
public IRubyObject allocate(Ruby runtime, RubyClass klass) {
|
17
|
-
return new IOBuffer(runtime, klass);
|
18
|
-
}
|
19
|
-
};
|
20
|
-
|
21
|
-
public static void createIOBuffer(Ruby runtime) {
|
22
|
-
RubyModule mPuma = runtime.defineModule("Puma");
|
23
|
-
RubyClass cIOBuffer = mPuma.defineClassUnder("IOBuffer", runtime.getObject(), ALLOCATOR);
|
24
|
-
cIOBuffer.defineAnnotatedMethods(IOBuffer.class);
|
25
|
-
}
|
26
|
-
|
27
|
-
private static final int DEFAULT_SIZE = 4096;
|
28
|
-
|
29
|
-
final ByteList buffer = new ByteList(DEFAULT_SIZE);
|
30
|
-
|
31
|
-
IOBuffer(Ruby runtime, RubyClass klass) {
|
32
|
-
super(runtime, klass);
|
33
|
-
}
|
34
|
-
|
35
|
-
@JRubyMethod
|
36
|
-
public RubyInteger used(ThreadContext context) {
|
37
|
-
return context.runtime.newFixnum(buffer.getRealSize());
|
38
|
-
}
|
39
|
-
|
40
|
-
@JRubyMethod
|
41
|
-
public RubyInteger capacity(ThreadContext context) {
|
42
|
-
return context.runtime.newFixnum(buffer.unsafeBytes().length);
|
43
|
-
}
|
44
|
-
|
45
|
-
@JRubyMethod
|
46
|
-
public IRubyObject reset() {
|
47
|
-
buffer.setRealSize(0);
|
48
|
-
return this;
|
49
|
-
}
|
50
|
-
|
51
|
-
@JRubyMethod(name = { "to_s", "to_str" })
|
52
|
-
public RubyString to_s(ThreadContext context) {
|
53
|
-
return RubyString.newStringShared(context.runtime, buffer.unsafeBytes(), 0, buffer.getRealSize());
|
54
|
-
}
|
55
|
-
|
56
|
-
@JRubyMethod(name = "<<")
|
57
|
-
public IRubyObject add(IRubyObject str) {
|
58
|
-
addImpl(str.convertToString());
|
59
|
-
return this;
|
60
|
-
}
|
61
|
-
|
62
|
-
@JRubyMethod(rest = true)
|
63
|
-
public IRubyObject append(IRubyObject[] strs) {
|
64
|
-
for (IRubyObject str : strs) addImpl(str.convertToString());
|
65
|
-
return this;
|
66
|
-
}
|
67
|
-
|
68
|
-
private void addImpl(RubyString str) {
|
69
|
-
buffer.append(str.getByteList());
|
70
|
-
}
|
71
|
-
|
72
|
-
}
|
data/lib/puma/accept_nonblock.rb
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'openssl'
|
4
|
-
|
5
|
-
module OpenSSL
|
6
|
-
module SSL
|
7
|
-
class SSLServer
|
8
|
-
unless public_method_defined? :accept_nonblock
|
9
|
-
def accept_nonblock
|
10
|
-
sock = @svr.accept_nonblock
|
11
|
-
|
12
|
-
begin
|
13
|
-
ssl = OpenSSL::SSL::SSLSocket.new(sock, @ctx)
|
14
|
-
ssl.sync_close = true
|
15
|
-
ssl.accept if @start_immediately
|
16
|
-
ssl
|
17
|
-
rescue SSLError => ex
|
18
|
-
if ssl
|
19
|
-
ssl.close
|
20
|
-
else
|
21
|
-
sock.close
|
22
|
-
end
|
23
|
-
raise ex
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
data/lib/puma/tcp_logger.rb
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Puma
|
4
|
-
class TCPLogger
|
5
|
-
def initialize(logger, app, quiet=false)
|
6
|
-
@logger = logger
|
7
|
-
@app = app
|
8
|
-
@quiet = quiet
|
9
|
-
end
|
10
|
-
|
11
|
-
FORMAT = "%s - %s"
|
12
|
-
|
13
|
-
def log(who, str)
|
14
|
-
now = Time.now.strftime("%d/%b/%Y %H:%M:%S")
|
15
|
-
|
16
|
-
log_str = "#{now} - #{who} - #{str}"
|
17
|
-
|
18
|
-
case @logger
|
19
|
-
when IO
|
20
|
-
@logger.puts log_str
|
21
|
-
when Events
|
22
|
-
@logger.log log_str
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def call(env, socket)
|
27
|
-
who = env[Const::REMOTE_ADDR]
|
28
|
-
log who, "connected" unless @quiet
|
29
|
-
|
30
|
-
env['log'] = lambda { |str| log(who, str) }
|
31
|
-
|
32
|
-
begin
|
33
|
-
@app.call env, socket
|
34
|
-
rescue Object => e
|
35
|
-
log who, "exception: #{e.message} (#{e.class})"
|
36
|
-
else
|
37
|
-
log who, "disconnected" unless @quiet
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
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
|
-
```
|