puma 2.2.0 → 8.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/History.md +3334 -0
- data/LICENSE +23 -20
- data/README.md +387 -100
- data/bin/puma-wild +25 -0
- data/bin/pumactl +1 -1
- data/docs/5.0-Upgrade.md +98 -0
- data/docs/6.0-Upgrade.md +56 -0
- data/docs/7.0-Upgrade.md +52 -0
- data/docs/8.0-Upgrade.md +100 -0
- data/docs/architecture.md +74 -0
- data/docs/compile_options.md +55 -0
- data/docs/deployment.md +137 -0
- data/docs/fork_worker.md +41 -0
- data/docs/grpc.md +62 -0
- data/docs/images/favicon.svg +1 -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/images/running-puma.svg +1 -0
- data/docs/images/standard-logo.svg +1 -0
- data/docs/java_options.md +54 -0
- data/docs/jungle/README.md +9 -0
- data/docs/jungle/rc.d/README.md +74 -0
- data/docs/jungle/rc.d/puma +61 -0
- data/docs/jungle/rc.d/puma.conf +10 -0
- data/docs/kubernetes.md +73 -0
- data/docs/nginx.md +5 -5
- data/docs/plugins.md +42 -0
- data/docs/rails_dev_mode.md +28 -0
- data/docs/restart.md +65 -0
- data/docs/signals.md +98 -0
- data/docs/stats.md +148 -0
- data/docs/systemd.md +253 -0
- data/docs/testing_benchmarks_local_files.md +150 -0
- data/docs/testing_test_rackup_ci_files.md +36 -0
- data/ext/puma_http11/PumaHttp11Service.java +2 -2
- data/ext/puma_http11/extconf.rb +59 -2
- data/ext/puma_http11/http11_parser.c +319 -487
- data/ext/puma_http11/http11_parser.h +15 -13
- data/ext/puma_http11/http11_parser.java.rl +64 -94
- data/ext/puma_http11/http11_parser.rl +27 -24
- data/ext/puma_http11/http11_parser_common.rl +8 -8
- data/ext/puma_http11/mini_ssl.c +696 -38
- data/ext/puma_http11/no_ssl/PumaHttp11Service.java +15 -0
- data/ext/puma_http11/org/jruby/puma/EnvKey.java +241 -0
- data/ext/puma_http11/org/jruby/puma/Http11.java +241 -145
- data/ext/puma_http11/org/jruby/puma/Http11Parser.java +174 -221
- data/ext/puma_http11/org/jruby/puma/MiniSSL.java +413 -193
- data/ext/puma_http11/puma_http11.c +183 -175
- data/lib/puma/app/status.rb +77 -29
- data/lib/puma/binder.rb +349 -119
- data/lib/puma/cli.rb +163 -801
- data/lib/puma/client.rb +627 -144
- data/lib/puma/client_env.rb +171 -0
- data/lib/puma/cluster/worker.rb +183 -0
- data/lib/puma/cluster/worker_handle.rb +127 -0
- data/lib/puma/cluster.rb +634 -0
- data/lib/puma/cluster_accept_loop_delay.rb +91 -0
- data/lib/puma/commonlogger.rb +115 -0
- data/lib/puma/configuration.rb +420 -198
- data/lib/puma/const.rb +266 -115
- data/lib/puma/control_cli.rb +219 -120
- data/lib/puma/detect.rb +56 -2
- data/lib/puma/dsl.rb +1562 -0
- data/lib/puma/error_logger.rb +115 -0
- data/lib/puma/events.rb +44 -60
- data/lib/puma/io_buffer.rb +48 -5
- data/lib/puma/jruby_restart.rb +2 -51
- data/lib/puma/json_serialization.rb +96 -0
- data/lib/puma/launcher/bundle_pruner.rb +102 -0
- data/lib/puma/launcher.rb +501 -0
- data/lib/puma/log_writer.rb +153 -0
- data/lib/puma/minissl/context_builder.rb +96 -0
- data/lib/puma/minissl.rb +355 -37
- data/lib/puma/null_io.rb +79 -12
- data/lib/puma/plugin/systemd.rb +90 -0
- data/lib/puma/plugin/tmp_restart.rb +36 -0
- data/lib/puma/plugin.rb +111 -0
- data/lib/puma/rack/builder.rb +297 -0
- data/lib/puma/rack/urlmap.rb +93 -0
- data/lib/puma/rack_default.rb +21 -4
- data/lib/puma/reactor.rb +102 -133
- data/lib/puma/response.rb +532 -0
- data/lib/puma/runner.rb +211 -0
- data/lib/puma/sd_notify.rb +146 -0
- data/lib/puma/server.rb +582 -445
- data/lib/puma/server_plugin_control.rb +32 -0
- data/lib/puma/single.rb +72 -0
- data/lib/puma/state_file.rb +69 -0
- data/lib/puma/thread_pool.rb +389 -57
- data/lib/puma/util.rb +125 -0
- data/lib/puma.rb +80 -6
- data/lib/rack/handler/puma.rb +125 -47
- data/tools/Dockerfile +26 -0
- data/tools/trickletest.rb +44 -0
- metadata +88 -148
- data/COPYING +0 -55
- data/Gemfile +0 -10
- data/History.txt +0 -302
- data/Manifest.txt +0 -60
- data/Rakefile +0 -165
- data/TODO +0 -5
- data/docs/config.md +0 -0
- data/ext/puma_http11/ext_help.h +0 -15
- data/ext/puma_http11/io_buffer.c +0 -154
- data/lib/puma/accept_nonblock.rb +0 -23
- data/lib/puma/capistrano.rb +0 -34
- data/lib/puma/compat.rb +0 -11
- data/lib/puma/daemon_ext.rb +0 -20
- data/lib/puma/delegation.rb +0 -11
- data/lib/puma/java_io_buffer.rb +0 -45
- data/lib/puma/rack_patch.rb +0 -25
- data/puma.gemspec +0 -45
- data/test/test_app_status.rb +0 -88
- data/test/test_cli.rb +0 -171
- data/test/test_config.rb +0 -16
- data/test/test_http10.rb +0 -27
- data/test/test_http11.rb +0 -126
- data/test/test_integration.rb +0 -154
- data/test/test_iobuffer.rb +0 -38
- data/test/test_minissl.rb +0 -25
- data/test/test_null_io.rb +0 -31
- data/test/test_persistent.rb +0 -238
- data/test/test_puma_server.rb +0 -224
- data/test/test_rack_handler.rb +0 -10
- data/test/test_rack_server.rb +0 -141
- data/test/test_thread_pool.rb +0 -146
- data/test/test_unix_socket.rb +0 -39
- data/test/test_ws.rb +0 -89
- data/tools/jungle/init.d/README.md +0 -54
- data/tools/jungle/init.d/puma +0 -332
- data/tools/jungle/init.d/run-puma +0 -3
- data/tools/jungle/upstart/README.md +0 -61
- data/tools/jungle/upstart/puma-manager.conf +0 -31
- data/tools/jungle/upstart/puma.conf +0 -52
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
package puma;
|
|
2
|
+
|
|
3
|
+
import java.io.IOException;
|
|
4
|
+
|
|
5
|
+
import org.jruby.Ruby;
|
|
6
|
+
import org.jruby.runtime.load.BasicLibraryService;
|
|
7
|
+
|
|
8
|
+
import org.jruby.puma.Http11;
|
|
9
|
+
|
|
10
|
+
public class PumaHttp11Service implements BasicLibraryService {
|
|
11
|
+
public boolean basicLoad(final Ruby runtime) throws IOException {
|
|
12
|
+
Http11.createHttp11(runtime);
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
package org.jruby.puma;
|
|
2
|
+
|
|
3
|
+
import org.jruby.util.ByteList;
|
|
4
|
+
|
|
5
|
+
import java.nio.charset.StandardCharsets;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* A set of keys representing HTTP/1.1 header fields and CGI env keys.
|
|
9
|
+
*
|
|
10
|
+
* The set of header fields is derived from RFC 2616 with some additions
|
|
11
|
+
* common to mainstream browsers.
|
|
12
|
+
*
|
|
13
|
+
* This enum is used by {@link Http11 }to access pre-allocated strings for
|
|
14
|
+
* Puma's version of these keys and includes a perfect hash function to quickly
|
|
15
|
+
* find the key for a given range of bytes.
|
|
16
|
+
*/
|
|
17
|
+
public enum EnvKey {
|
|
18
|
+
ACCEPT,
|
|
19
|
+
ACCEPT_CHARSET,
|
|
20
|
+
ACCEPT_ENCODING,
|
|
21
|
+
ACCEPT_LANGUAGE,
|
|
22
|
+
ACCEPT_RANGES,
|
|
23
|
+
AGE,
|
|
24
|
+
ALLOW,
|
|
25
|
+
AUTHORIZATION,
|
|
26
|
+
CACHE_CONTROL,
|
|
27
|
+
CONNECTION,
|
|
28
|
+
CONTENT_ENCODING,
|
|
29
|
+
CONTENT_LANGUAGE,
|
|
30
|
+
CONTENT_LENGTH(true),
|
|
31
|
+
CONTENT_LOCATION,
|
|
32
|
+
CONTENT_MD5,
|
|
33
|
+
CONTENT_RANGE,
|
|
34
|
+
CONTENT_TYPE(true),
|
|
35
|
+
DATE,
|
|
36
|
+
ETAG,
|
|
37
|
+
EXPECT,
|
|
38
|
+
EXPIRES,
|
|
39
|
+
FRAGMENT(true),
|
|
40
|
+
FROM,
|
|
41
|
+
HOST,
|
|
42
|
+
IF_MATCH,
|
|
43
|
+
IF_MODIFIED_SINCE,
|
|
44
|
+
IF_NONE_MATCH,
|
|
45
|
+
IF_RANGE,
|
|
46
|
+
IF_UNMODIFIED_SINCE,
|
|
47
|
+
KEEP_ALIVE,
|
|
48
|
+
LAST_MODIFIED,
|
|
49
|
+
LOCATION,
|
|
50
|
+
MAX_FORWARDS,
|
|
51
|
+
PRAGMA,
|
|
52
|
+
PROXY_AUTHENTICATE,
|
|
53
|
+
PROXY_AUTHORIZATION,
|
|
54
|
+
QUERY_STRING(true),
|
|
55
|
+
RANGE,
|
|
56
|
+
REFERER,
|
|
57
|
+
REQUEST_METHOD(true),
|
|
58
|
+
REQUEST_PATH(true),
|
|
59
|
+
REQUEST_URI(true),
|
|
60
|
+
RETRY_AFTER,
|
|
61
|
+
SERVER,
|
|
62
|
+
SERVER_PROTOCOL(true),
|
|
63
|
+
TE,
|
|
64
|
+
TRAILER,
|
|
65
|
+
TRANSFER_ENCODING,
|
|
66
|
+
UPGRADE,
|
|
67
|
+
USER_AGENT,
|
|
68
|
+
VARY,
|
|
69
|
+
VIA,
|
|
70
|
+
X_FORWARDED_FOR,
|
|
71
|
+
X_REAL_IP,
|
|
72
|
+
WARNING,
|
|
73
|
+
WWW_AUTHENTICATE;
|
|
74
|
+
|
|
75
|
+
final ByteList httpName;
|
|
76
|
+
|
|
77
|
+
EnvKey() {
|
|
78
|
+
this(false);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
EnvKey(boolean raw) {
|
|
82
|
+
String httpName = raw ? name() : "HTTP_" + name();
|
|
83
|
+
this.httpName = new ByteList(ByteList.plain(httpName), false);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Using a perfect hash, find the EnvKey for a given field name, or null if none matches.
|
|
88
|
+
*
|
|
89
|
+
* Generated by the gperf tool as C and adapted to Java. Must be regenerated if the set of keys changes.
|
|
90
|
+
*
|
|
91
|
+
* @param buffer the buffer containing the field name
|
|
92
|
+
* @param start the starting offset of the field name
|
|
93
|
+
* @param len the length of the field name
|
|
94
|
+
* @return the matching EnvKey, or else null
|
|
95
|
+
*/
|
|
96
|
+
public static EnvKey keyForField(byte[] buffer, int start, int len) {
|
|
97
|
+
int key = hash(buffer, start, len);
|
|
98
|
+
|
|
99
|
+
if (key <= MAX_HASH_VALUE) {
|
|
100
|
+
EnvKey match = keyList[key];
|
|
101
|
+
|
|
102
|
+
if (match != null && equalsIgnoreCase(buffer, start, len, match.name())) {
|
|
103
|
+
return match;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
private static boolean equalsIgnoreCase(byte[] buf, int start, int len, String key) {
|
|
110
|
+
int slen = key.length();
|
|
111
|
+
if (len != slen) return false;
|
|
112
|
+
for (int i = 0; i < slen; i++) {
|
|
113
|
+
byte b1 = buf[start + i];
|
|
114
|
+
byte b2 = (byte) key.charAt(i);
|
|
115
|
+
if (Http11.snakeUpcase(b1) != b2) return false;
|
|
116
|
+
}
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
private static int hash(byte[] buffer, int start, int len) {
|
|
121
|
+
return len
|
|
122
|
+
+ asso_values[Byte.toUnsignedInt(Http11.snakeUpcase(buffer[start + len - 1]))]
|
|
123
|
+
+ asso_values[Byte.toUnsignedInt(Http11.snakeUpcase(buffer[start]))];
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
private static final int MAX_HASH_VALUE = 94;
|
|
127
|
+
|
|
128
|
+
private final static int[] asso_values = {
|
|
129
|
+
95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
|
|
130
|
+
95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
|
|
131
|
+
95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
|
|
132
|
+
95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
|
|
133
|
+
95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
|
|
134
|
+
95, 95, 95, 10, 95, 95, 95, 95, 95, 95,
|
|
135
|
+
95, 95, 95, 95, 95, 5, 95, 15, 40, 0,
|
|
136
|
+
0, 10, 10, 15, 95, 0, 20, 5, 25, 95,
|
|
137
|
+
50, 40, 0, 40, 10, 35, 5, 35, 0, 10,
|
|
138
|
+
95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
|
|
139
|
+
95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
|
|
140
|
+
95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
|
|
141
|
+
95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
|
|
142
|
+
95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
|
|
143
|
+
95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
|
|
144
|
+
95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
|
|
145
|
+
95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
|
|
146
|
+
95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
|
|
147
|
+
95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
|
|
148
|
+
95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
|
|
149
|
+
95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
|
|
150
|
+
95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
|
|
151
|
+
95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
|
|
152
|
+
95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
|
|
153
|
+
95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
|
|
154
|
+
95, 95, 95, 95, 95, 95
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
private static final EnvKey[] keyList = {
|
|
158
|
+
null, null, null, null, null,
|
|
159
|
+
EnvKey.RANGE,
|
|
160
|
+
null,
|
|
161
|
+
EnvKey.REFERER,
|
|
162
|
+
EnvKey.AGE,
|
|
163
|
+
EnvKey.FROM,
|
|
164
|
+
EnvKey.KEEP_ALIVE,
|
|
165
|
+
EnvKey.RETRY_AFTER,
|
|
166
|
+
EnvKey.TE,
|
|
167
|
+
EnvKey.VIA,
|
|
168
|
+
EnvKey.ETAG,
|
|
169
|
+
EnvKey.X_FORWARDED_FOR,
|
|
170
|
+
EnvKey.EXPECT,
|
|
171
|
+
EnvKey.TRAILER,
|
|
172
|
+
EnvKey.FRAGMENT,
|
|
173
|
+
EnvKey.VARY,
|
|
174
|
+
EnvKey.ACCEPT_LANGUAGE,
|
|
175
|
+
EnvKey.ACCEPT,
|
|
176
|
+
EnvKey.REQUEST_PATH,
|
|
177
|
+
EnvKey.IF_RANGE,
|
|
178
|
+
EnvKey.HOST,
|
|
179
|
+
null,
|
|
180
|
+
EnvKey.REQUEST_URI,
|
|
181
|
+
EnvKey.CONTENT_TYPE,
|
|
182
|
+
EnvKey.CONTENT_RANGE,
|
|
183
|
+
EnvKey.ACCEPT_CHARSET,
|
|
184
|
+
EnvKey.ACCEPT_ENCODING,
|
|
185
|
+
EnvKey.CONTENT_LANGUAGE,
|
|
186
|
+
EnvKey.IF_MODIFIED_SINCE,
|
|
187
|
+
EnvKey.IF_MATCH,
|
|
188
|
+
EnvKey.IF_UNMODIFIED_SINCE,
|
|
189
|
+
null,
|
|
190
|
+
EnvKey.CONTENT_MD5,
|
|
191
|
+
EnvKey.TRANSFER_ENCODING,
|
|
192
|
+
EnvKey.IF_NONE_MATCH,
|
|
193
|
+
EnvKey.CONTENT_LENGTH,
|
|
194
|
+
null,
|
|
195
|
+
EnvKey.CONTENT_ENCODING,
|
|
196
|
+
EnvKey.UPGRADE,
|
|
197
|
+
EnvKey.AUTHORIZATION,
|
|
198
|
+
EnvKey.DATE,
|
|
199
|
+
EnvKey.ALLOW,
|
|
200
|
+
EnvKey.SERVER,
|
|
201
|
+
EnvKey.EXPIRES,
|
|
202
|
+
EnvKey.CACHE_CONTROL,
|
|
203
|
+
null,
|
|
204
|
+
EnvKey.CONNECTION,
|
|
205
|
+
EnvKey.WWW_AUTHENTICATE,
|
|
206
|
+
EnvKey.WARNING,
|
|
207
|
+
EnvKey.LOCATION,
|
|
208
|
+
EnvKey.REQUEST_METHOD,
|
|
209
|
+
EnvKey.USER_AGENT,
|
|
210
|
+
EnvKey.CONTENT_LOCATION,
|
|
211
|
+
EnvKey.MAX_FORWARDS,
|
|
212
|
+
EnvKey.ACCEPT_RANGES,
|
|
213
|
+
EnvKey.X_REAL_IP,
|
|
214
|
+
null,
|
|
215
|
+
EnvKey.PRAGMA,
|
|
216
|
+
EnvKey.QUERY_STRING,
|
|
217
|
+
null, null, null, null, null,
|
|
218
|
+
EnvKey.PROXY_AUTHENTICATE,
|
|
219
|
+
null, null, null, null,
|
|
220
|
+
EnvKey.LAST_MODIFIED,
|
|
221
|
+
null,
|
|
222
|
+
EnvKey.SERVER_PROTOCOL,
|
|
223
|
+
null, null, null, null, null, null, null, null, null,
|
|
224
|
+
null, null, null, null, null, null, null, null, null,
|
|
225
|
+
EnvKey.PROXY_AUTHORIZATION
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
static {
|
|
229
|
+
// The perfect hash function must be regenerated if the list above changes
|
|
230
|
+
for (EnvKey key : values()) {
|
|
231
|
+
EnvKey found;
|
|
232
|
+
assert (found = keyForKey(key)) == key : key + " was not matched by perfect hash and found " + found;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// Only used for verification of the perfect hash, at boot with asserts enabled.
|
|
237
|
+
private static EnvKey keyForKey(EnvKey key) {
|
|
238
|
+
byte[] bytes = key.name().getBytes(StandardCharsets.ISO_8859_1);
|
|
239
|
+
return keyList[hash(bytes, 0, bytes.length)];
|
|
240
|
+
}
|
|
241
|
+
}
|