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.
Files changed (136) hide show
  1. checksums.yaml +7 -0
  2. data/History.md +3334 -0
  3. data/LICENSE +23 -20
  4. data/README.md +387 -100
  5. data/bin/puma-wild +25 -0
  6. data/bin/pumactl +1 -1
  7. data/docs/5.0-Upgrade.md +98 -0
  8. data/docs/6.0-Upgrade.md +56 -0
  9. data/docs/7.0-Upgrade.md +52 -0
  10. data/docs/8.0-Upgrade.md +100 -0
  11. data/docs/architecture.md +74 -0
  12. data/docs/compile_options.md +55 -0
  13. data/docs/deployment.md +137 -0
  14. data/docs/fork_worker.md +41 -0
  15. data/docs/grpc.md +62 -0
  16. data/docs/images/favicon.svg +1 -0
  17. data/docs/images/puma-connection-flow-no-reactor.png +0 -0
  18. data/docs/images/puma-connection-flow.png +0 -0
  19. data/docs/images/puma-general-arch.png +0 -0
  20. data/docs/images/running-puma.svg +1 -0
  21. data/docs/images/standard-logo.svg +1 -0
  22. data/docs/java_options.md +54 -0
  23. data/docs/jungle/README.md +9 -0
  24. data/docs/jungle/rc.d/README.md +74 -0
  25. data/docs/jungle/rc.d/puma +61 -0
  26. data/docs/jungle/rc.d/puma.conf +10 -0
  27. data/docs/kubernetes.md +73 -0
  28. data/docs/nginx.md +5 -5
  29. data/docs/plugins.md +42 -0
  30. data/docs/rails_dev_mode.md +28 -0
  31. data/docs/restart.md +65 -0
  32. data/docs/signals.md +98 -0
  33. data/docs/stats.md +148 -0
  34. data/docs/systemd.md +253 -0
  35. data/docs/testing_benchmarks_local_files.md +150 -0
  36. data/docs/testing_test_rackup_ci_files.md +36 -0
  37. data/ext/puma_http11/PumaHttp11Service.java +2 -2
  38. data/ext/puma_http11/extconf.rb +59 -2
  39. data/ext/puma_http11/http11_parser.c +319 -487
  40. data/ext/puma_http11/http11_parser.h +15 -13
  41. data/ext/puma_http11/http11_parser.java.rl +64 -94
  42. data/ext/puma_http11/http11_parser.rl +27 -24
  43. data/ext/puma_http11/http11_parser_common.rl +8 -8
  44. data/ext/puma_http11/mini_ssl.c +696 -38
  45. data/ext/puma_http11/no_ssl/PumaHttp11Service.java +15 -0
  46. data/ext/puma_http11/org/jruby/puma/EnvKey.java +241 -0
  47. data/ext/puma_http11/org/jruby/puma/Http11.java +241 -145
  48. data/ext/puma_http11/org/jruby/puma/Http11Parser.java +174 -221
  49. data/ext/puma_http11/org/jruby/puma/MiniSSL.java +413 -193
  50. data/ext/puma_http11/puma_http11.c +183 -175
  51. data/lib/puma/app/status.rb +77 -29
  52. data/lib/puma/binder.rb +349 -119
  53. data/lib/puma/cli.rb +163 -801
  54. data/lib/puma/client.rb +627 -144
  55. data/lib/puma/client_env.rb +171 -0
  56. data/lib/puma/cluster/worker.rb +183 -0
  57. data/lib/puma/cluster/worker_handle.rb +127 -0
  58. data/lib/puma/cluster.rb +634 -0
  59. data/lib/puma/cluster_accept_loop_delay.rb +91 -0
  60. data/lib/puma/commonlogger.rb +115 -0
  61. data/lib/puma/configuration.rb +420 -198
  62. data/lib/puma/const.rb +266 -115
  63. data/lib/puma/control_cli.rb +219 -120
  64. data/lib/puma/detect.rb +56 -2
  65. data/lib/puma/dsl.rb +1562 -0
  66. data/lib/puma/error_logger.rb +115 -0
  67. data/lib/puma/events.rb +44 -60
  68. data/lib/puma/io_buffer.rb +48 -5
  69. data/lib/puma/jruby_restart.rb +2 -51
  70. data/lib/puma/json_serialization.rb +96 -0
  71. data/lib/puma/launcher/bundle_pruner.rb +102 -0
  72. data/lib/puma/launcher.rb +501 -0
  73. data/lib/puma/log_writer.rb +153 -0
  74. data/lib/puma/minissl/context_builder.rb +96 -0
  75. data/lib/puma/minissl.rb +355 -37
  76. data/lib/puma/null_io.rb +79 -12
  77. data/lib/puma/plugin/systemd.rb +90 -0
  78. data/lib/puma/plugin/tmp_restart.rb +36 -0
  79. data/lib/puma/plugin.rb +111 -0
  80. data/lib/puma/rack/builder.rb +297 -0
  81. data/lib/puma/rack/urlmap.rb +93 -0
  82. data/lib/puma/rack_default.rb +21 -4
  83. data/lib/puma/reactor.rb +102 -133
  84. data/lib/puma/response.rb +532 -0
  85. data/lib/puma/runner.rb +211 -0
  86. data/lib/puma/sd_notify.rb +146 -0
  87. data/lib/puma/server.rb +582 -445
  88. data/lib/puma/server_plugin_control.rb +32 -0
  89. data/lib/puma/single.rb +72 -0
  90. data/lib/puma/state_file.rb +69 -0
  91. data/lib/puma/thread_pool.rb +389 -57
  92. data/lib/puma/util.rb +125 -0
  93. data/lib/puma.rb +80 -6
  94. data/lib/rack/handler/puma.rb +125 -47
  95. data/tools/Dockerfile +26 -0
  96. data/tools/trickletest.rb +44 -0
  97. metadata +88 -148
  98. data/COPYING +0 -55
  99. data/Gemfile +0 -10
  100. data/History.txt +0 -302
  101. data/Manifest.txt +0 -60
  102. data/Rakefile +0 -165
  103. data/TODO +0 -5
  104. data/docs/config.md +0 -0
  105. data/ext/puma_http11/ext_help.h +0 -15
  106. data/ext/puma_http11/io_buffer.c +0 -154
  107. data/lib/puma/accept_nonblock.rb +0 -23
  108. data/lib/puma/capistrano.rb +0 -34
  109. data/lib/puma/compat.rb +0 -11
  110. data/lib/puma/daemon_ext.rb +0 -20
  111. data/lib/puma/delegation.rb +0 -11
  112. data/lib/puma/java_io_buffer.rb +0 -45
  113. data/lib/puma/rack_patch.rb +0 -25
  114. data/puma.gemspec +0 -45
  115. data/test/test_app_status.rb +0 -88
  116. data/test/test_cli.rb +0 -171
  117. data/test/test_config.rb +0 -16
  118. data/test/test_http10.rb +0 -27
  119. data/test/test_http11.rb +0 -126
  120. data/test/test_integration.rb +0 -154
  121. data/test/test_iobuffer.rb +0 -38
  122. data/test/test_minissl.rb +0 -25
  123. data/test/test_null_io.rb +0 -31
  124. data/test/test_persistent.rb +0 -238
  125. data/test/test_puma_server.rb +0 -224
  126. data/test/test_rack_handler.rb +0 -10
  127. data/test/test_rack_server.rb +0 -141
  128. data/test/test_thread_pool.rb +0 -146
  129. data/test/test_unix_socket.rb +0 -39
  130. data/test/test_ws.rb +0 -89
  131. data/tools/jungle/init.d/README.md +0 -54
  132. data/tools/jungle/init.d/puma +0 -332
  133. data/tools/jungle/init.d/run-puma +0 -3
  134. data/tools/jungle/upstart/README.md +0 -61
  135. data/tools/jungle/upstart/puma-manager.conf +0 -31
  136. 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
+ }