puma 5.6.4 → 6.4.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.md +372 -6
- data/LICENSE +0 -0
- data/README.md +79 -29
- data/bin/puma-wild +1 -1
- data/docs/architecture.md +0 -0
- data/docs/compile_options.md +34 -0
- data/docs/deployment.md +0 -0
- data/docs/fork_worker.md +1 -3
- 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 +0 -0
- data/docs/jungle/rc.d/README.md +0 -0
- data/docs/jungle/rc.d/puma.conf +0 -0
- data/docs/kubernetes.md +12 -0
- data/docs/nginx.md +1 -1
- data/docs/plugins.md +0 -0
- data/docs/rails_dev_mode.md +0 -0
- data/docs/restart.md +1 -0
- data/docs/signals.md +0 -0
- data/docs/stats.md +0 -0
- data/docs/systemd.md +3 -6
- 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 +0 -0
- data/ext/puma_http11/ext_help.h +0 -0
- data/ext/puma_http11/extconf.rb +22 -10
- data/ext/puma_http11/http11_parser.c +1 -1
- data/ext/puma_http11/http11_parser.h +1 -1
- data/ext/puma_http11/http11_parser.java.rl +2 -2
- data/ext/puma_http11/http11_parser.rl +2 -2
- data/ext/puma_http11/http11_parser_common.rl +2 -2
- data/ext/puma_http11/mini_ssl.c +153 -27
- data/ext/puma_http11/no_ssl/PumaHttp11Service.java +0 -0
- data/ext/puma_http11/org/jruby/puma/Http11.java +3 -3
- data/ext/puma_http11/org/jruby/puma/Http11Parser.java +1 -1
- data/ext/puma_http11/org/jruby/puma/MiniSSL.java +167 -65
- data/ext/puma_http11/puma_http11.c +17 -9
- data/lib/puma/app/status.rb +7 -4
- data/lib/puma/binder.rb +51 -54
- data/lib/puma/cli.rb +16 -18
- data/lib/puma/client.rb +100 -26
- data/lib/puma/cluster/worker.rb +18 -11
- data/lib/puma/cluster/worker_handle.rb +4 -1
- data/lib/puma/cluster.rb +102 -40
- data/lib/puma/commonlogger.rb +21 -14
- data/lib/puma/configuration.rb +77 -59
- data/lib/puma/const.rb +129 -92
- data/lib/puma/control_cli.rb +33 -23
- data/lib/puma/detect.rb +7 -4
- data/lib/puma/dsl.rb +251 -53
- data/lib/puma/error_logger.rb +18 -9
- data/lib/puma/events.rb +6 -126
- data/lib/puma/io_buffer.rb +39 -4
- data/lib/puma/jruby_restart.rb +2 -1
- data/lib/puma/json_serialization.rb +0 -0
- data/lib/puma/launcher/bundle_pruner.rb +104 -0
- data/lib/puma/launcher.rb +113 -175
- data/lib/puma/log_writer.rb +147 -0
- data/lib/puma/minissl/context_builder.rb +26 -12
- data/lib/puma/minissl.rb +113 -15
- data/lib/puma/null_io.rb +21 -2
- data/lib/puma/plugin/systemd.rb +90 -0
- data/lib/puma/plugin/tmp_restart.rb +1 -1
- data/lib/puma/plugin.rb +0 -0
- data/lib/puma/rack/builder.rb +6 -6
- data/lib/puma/rack/urlmap.rb +1 -1
- data/lib/puma/rack_default.rb +19 -4
- data/lib/puma/reactor.rb +19 -10
- data/lib/puma/request.rb +365 -166
- data/lib/puma/runner.rb +56 -20
- data/lib/puma/sd_notify.rb +149 -0
- data/lib/puma/server.rb +137 -87
- data/lib/puma/single.rb +13 -11
- data/lib/puma/state_file.rb +4 -6
- data/lib/puma/thread_pool.rb +57 -19
- data/lib/puma/util.rb +12 -14
- data/lib/puma.rb +12 -11
- data/lib/rack/handler/puma.rb +113 -86
- data/tools/Dockerfile +2 -2
- data/tools/trickletest.rb +0 -0
- metadata +11 -6
- data/lib/puma/queue_close.rb +0 -26
- data/lib/puma/systemd.rb +0 -46
@@ -39,8 +39,8 @@ public class Http11Parser {
|
|
39
39
|
Http11.query_string(runtime, parser.data, parser.buffer, parser.query_start, fpc-parser.query_start);
|
40
40
|
}
|
41
41
|
|
42
|
-
action
|
43
|
-
Http11.
|
42
|
+
action server_protocol {
|
43
|
+
Http11.server_protocol(runtime, parser.data, parser.buffer, parser.mark, fpc-parser.mark);
|
44
44
|
}
|
45
45
|
|
46
46
|
action request_path {
|
@@ -62,8 +62,8 @@ static void snake_upcase_char(char *c)
|
|
62
62
|
parser->query_string(parser, PTR_TO(query_start), LEN(query_start, fpc));
|
63
63
|
}
|
64
64
|
|
65
|
-
action
|
66
|
-
parser->
|
65
|
+
action server_protocol {
|
66
|
+
parser->server_protocol(parser, PTR_TO(mark), LEN(mark, fpc));
|
67
67
|
}
|
68
68
|
|
69
69
|
action request_path {
|
@@ -38,8 +38,8 @@
|
|
38
38
|
Method = ( upper | digit | safe ){1,20} >mark %request_method;
|
39
39
|
|
40
40
|
http_number = ( digit+ "." digit+ ) ;
|
41
|
-
|
42
|
-
Request_Line = ( Method " " Request_URI ("#" Fragment){0,1} " "
|
41
|
+
Server_Protocol = ( "HTTP/" http_number ) >mark %server_protocol ;
|
42
|
+
Request_Line = ( Method " " Request_URI ("#" Fragment){0,1} " " Server_Protocol CRLF ) ;
|
43
43
|
|
44
44
|
field_name = ( token -- ":" )+ >start_field $snake_upcase_field %write_field;
|
45
45
|
|
data/ext/puma_http11/mini_ssl.c
CHANGED
@@ -30,6 +30,18 @@ typedef struct {
|
|
30
30
|
|
31
31
|
VALUE eError;
|
32
32
|
|
33
|
+
NORETURN(void raise_file_error(const char* caller, const char *filename));
|
34
|
+
|
35
|
+
void raise_file_error(const char* caller, const char *filename) {
|
36
|
+
rb_raise(eError, "%s: error in file '%s': %s", caller, filename, ERR_error_string(ERR_get_error(), NULL));
|
37
|
+
}
|
38
|
+
|
39
|
+
NORETURN(void raise_param_error(const char* caller, const char *param));
|
40
|
+
|
41
|
+
void raise_param_error(const char* caller, const char *param) {
|
42
|
+
rb_raise(eError, "%s: error with parameter '%s': %s", caller, param, ERR_error_string(ERR_get_error(), NULL));
|
43
|
+
}
|
44
|
+
|
33
45
|
void engine_free(void *ptr) {
|
34
46
|
ms_conn *conn = ptr;
|
35
47
|
ms_cert_buf* cert_buf = (ms_cert_buf*)SSL_get_app_data(conn->ssl);
|
@@ -49,7 +61,7 @@ const rb_data_type_t engine_data_type = {
|
|
49
61
|
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
|
50
62
|
};
|
51
63
|
|
52
|
-
#ifndef
|
64
|
+
#ifndef HAVE_SSL_CTX_SET_DH_AUTO
|
53
65
|
DH *get_dh2048(void) {
|
54
66
|
/* `openssl dhparam -C 2048`
|
55
67
|
* -----BEGIN DH PARAMETERS-----
|
@@ -92,13 +104,13 @@ DH *get_dh2048(void) {
|
|
92
104
|
static unsigned char dh2048_g[] = { 0x02 };
|
93
105
|
|
94
106
|
DH *dh;
|
95
|
-
#if !(OPENSSL_VERSION_NUMBER < 0x10100005L
|
107
|
+
#if !(OPENSSL_VERSION_NUMBER < 0x10100005L)
|
96
108
|
BIGNUM *p, *g;
|
97
109
|
#endif
|
98
110
|
|
99
111
|
dh = DH_new();
|
100
112
|
|
101
|
-
#if OPENSSL_VERSION_NUMBER < 0x10100005L
|
113
|
+
#if OPENSSL_VERSION_NUMBER < 0x10100005L
|
102
114
|
dh->p = BN_bin2bn(dh2048_p, sizeof(dh2048_p), NULL);
|
103
115
|
dh->g = BN_bin2bn(dh2048_g, sizeof(dh2048_g), NULL);
|
104
116
|
|
@@ -179,6 +191,18 @@ static int engine_verify_callback(int preverify_ok, X509_STORE_CTX* ctx) {
|
|
179
191
|
return preverify_ok;
|
180
192
|
}
|
181
193
|
|
194
|
+
static int password_callback(char *buf, int size, int rwflag, void *userdata) {
|
195
|
+
const char *password = (const char *) userdata;
|
196
|
+
size_t len = strlen(password);
|
197
|
+
|
198
|
+
if (len > (size_t) size) {
|
199
|
+
return 0;
|
200
|
+
}
|
201
|
+
|
202
|
+
memcpy(buf, password, len);
|
203
|
+
return (int) len;
|
204
|
+
}
|
205
|
+
|
182
206
|
static VALUE
|
183
207
|
sslctx_alloc(VALUE klass) {
|
184
208
|
SSL_CTX *ctx;
|
@@ -204,28 +228,35 @@ sslctx_alloc(VALUE klass) {
|
|
204
228
|
VALUE
|
205
229
|
sslctx_initialize(VALUE self, VALUE mini_ssl_ctx) {
|
206
230
|
SSL_CTX* ctx;
|
207
|
-
|
231
|
+
int ssl_options;
|
232
|
+
VALUE key, cert, ca, verify_mode, ssl_cipher_filter, no_tlsv1, no_tlsv1_1,
|
233
|
+
verification_flags, session_id_bytes, cert_pem, key_pem, key_password_command, key_password;
|
234
|
+
BIO *bio;
|
235
|
+
X509 *x509 = NULL;
|
236
|
+
EVP_PKEY *pkey;
|
237
|
+
pem_password_cb *password_cb = NULL;
|
238
|
+
const char *password = NULL;
|
208
239
|
#ifdef HAVE_SSL_CTX_SET_MIN_PROTO_VERSION
|
209
240
|
int min;
|
210
241
|
#endif
|
211
|
-
|
212
|
-
VALUE key, cert, ca, verify_mode, ssl_cipher_filter, no_tlsv1, no_tlsv1_1,
|
213
|
-
verification_flags, session_id_bytes, cert_pem, key_pem;
|
214
|
-
#ifndef HAVE_SSL_GET1_PEER_CERTIFICATE
|
242
|
+
#ifndef HAVE_SSL_CTX_SET_DH_AUTO
|
215
243
|
DH *dh;
|
216
244
|
#endif
|
217
|
-
BIO *bio;
|
218
|
-
X509 *x509;
|
219
|
-
EVP_PKEY *pkey;
|
220
|
-
|
221
245
|
#if OPENSSL_VERSION_NUMBER < 0x10002000L
|
222
246
|
EC_KEY *ecdh;
|
223
247
|
#endif
|
248
|
+
#ifdef HAVE_SSL_CTX_SET_SESSION_CACHE_MODE
|
249
|
+
VALUE reuse, reuse_cache_size, reuse_timeout;
|
224
250
|
|
225
|
-
|
251
|
+
reuse = rb_funcall(mini_ssl_ctx, rb_intern_const("reuse"), 0);
|
252
|
+
reuse_cache_size = rb_funcall(mini_ssl_ctx, rb_intern_const("reuse_cache_size"), 0);
|
253
|
+
reuse_timeout = rb_funcall(mini_ssl_ctx, rb_intern_const("reuse_timeout"), 0);
|
254
|
+
#endif
|
226
255
|
|
227
256
|
key = rb_funcall(mini_ssl_ctx, rb_intern_const("key"), 0);
|
228
257
|
|
258
|
+
key_password_command = rb_funcall(mini_ssl_ctx, rb_intern_const("key_password_command"), 0);
|
259
|
+
|
229
260
|
cert = rb_funcall(mini_ssl_ctx, rb_intern_const("cert"), 0);
|
230
261
|
|
231
262
|
ca = rb_funcall(mini_ssl_ctx, rb_intern_const("ca"), 0);
|
@@ -242,30 +273,109 @@ sslctx_initialize(VALUE self, VALUE mini_ssl_ctx) {
|
|
242
273
|
|
243
274
|
no_tlsv1_1 = rb_funcall(mini_ssl_ctx, rb_intern_const("no_tlsv1_1"), 0);
|
244
275
|
|
276
|
+
TypedData_Get_Struct(self, SSL_CTX, &sslctx_type, ctx);
|
277
|
+
|
245
278
|
if (!NIL_P(cert)) {
|
246
279
|
StringValue(cert);
|
247
|
-
|
280
|
+
|
281
|
+
if (SSL_CTX_use_certificate_chain_file(ctx, RSTRING_PTR(cert)) != 1) {
|
282
|
+
raise_file_error("SSL_CTX_use_certificate_chain_file", RSTRING_PTR(cert));
|
283
|
+
}
|
284
|
+
}
|
285
|
+
|
286
|
+
if (!NIL_P(key_password_command)) {
|
287
|
+
key_password = rb_funcall(mini_ssl_ctx, rb_intern_const("key_password"), 0);
|
288
|
+
|
289
|
+
if (!NIL_P(key_password)) {
|
290
|
+
StringValue(key_password);
|
291
|
+
password_cb = password_callback;
|
292
|
+
password = RSTRING_PTR(key_password);
|
293
|
+
SSL_CTX_set_default_passwd_cb(ctx, password_cb);
|
294
|
+
SSL_CTX_set_default_passwd_cb_userdata(ctx, (void *) password);
|
295
|
+
}
|
248
296
|
}
|
249
297
|
|
250
298
|
if (!NIL_P(key)) {
|
251
299
|
StringValue(key);
|
252
|
-
|
300
|
+
|
301
|
+
if (SSL_CTX_use_PrivateKey_file(ctx, RSTRING_PTR(key), SSL_FILETYPE_PEM) != 1) {
|
302
|
+
raise_file_error("SSL_CTX_use_PrivateKey_file", RSTRING_PTR(key));
|
303
|
+
}
|
253
304
|
}
|
254
305
|
|
255
306
|
if (!NIL_P(cert_pem)) {
|
307
|
+
X509 *ca = NULL;
|
308
|
+
unsigned long err;
|
309
|
+
|
256
310
|
bio = BIO_new(BIO_s_mem());
|
257
311
|
BIO_puts(bio, RSTRING_PTR(cert_pem));
|
312
|
+
|
313
|
+
/**
|
314
|
+
* Much of this pulled as a simplified version of the `use_certificate_chain_file` method
|
315
|
+
* from openssl's `ssl_rsa.c` file.
|
316
|
+
*/
|
317
|
+
|
318
|
+
/* first read the cert as the first item in the pem file */
|
258
319
|
x509 = PEM_read_bio_X509(bio, NULL, NULL, NULL);
|
320
|
+
if (NULL == x509) {
|
321
|
+
BIO_free_all(bio);
|
322
|
+
raise_param_error("PEM_read_bio_X509", "cert_pem");
|
323
|
+
}
|
324
|
+
|
325
|
+
/* Add the cert to the context */
|
326
|
+
/* 1 is success - otherwise check the error codes */
|
327
|
+
if (1 != SSL_CTX_use_certificate(ctx, x509)) {
|
328
|
+
BIO_free_all(bio);
|
329
|
+
raise_param_error("SSL_CTX_use_certificate", "cert_pem");
|
330
|
+
}
|
331
|
+
|
332
|
+
X509_free(x509); /* no longer need our reference */
|
333
|
+
|
334
|
+
/* Now lets load up the rest of the certificate chain */
|
335
|
+
/* 1 is success 0 is error */
|
336
|
+
if (0 == SSL_CTX_clear_chain_certs(ctx)) {
|
337
|
+
BIO_free_all(bio);
|
338
|
+
raise_param_error("SSL_CTX_clear_chain_certs","cert_pem");
|
339
|
+
}
|
340
|
+
|
341
|
+
while (1) {
|
342
|
+
ca = PEM_read_bio_X509(bio, NULL, NULL, NULL);
|
343
|
+
|
344
|
+
if (NULL == ca) {
|
345
|
+
break;
|
346
|
+
}
|
347
|
+
|
348
|
+
if (0 == SSL_CTX_add0_chain_cert(ctx, ca)) {
|
349
|
+
BIO_free_all(bio);
|
350
|
+
raise_param_error("SSL_CTX_add0_chain_cert","cert_pem");
|
351
|
+
}
|
352
|
+
/* don't free ca - its now owned by the context */
|
353
|
+
}
|
354
|
+
|
355
|
+
/* ca is NULL - so its either the end of the file or an error */
|
356
|
+
err = ERR_peek_last_error();
|
259
357
|
|
260
|
-
|
358
|
+
/* If its the end of the file - then we are done, in any case free the bio */
|
359
|
+
BIO_free_all(bio);
|
360
|
+
|
361
|
+
if ((ERR_GET_LIB(err) == ERR_LIB_PEM) && (ERR_GET_REASON(err) == PEM_R_NO_START_LINE)) {
|
362
|
+
ERR_clear_error();
|
363
|
+
} else {
|
364
|
+
raise_param_error("PEM_read_bio_X509","cert_pem");
|
365
|
+
}
|
261
366
|
}
|
262
367
|
|
263
368
|
if (!NIL_P(key_pem)) {
|
264
369
|
bio = BIO_new(BIO_s_mem());
|
265
370
|
BIO_puts(bio, RSTRING_PTR(key_pem));
|
266
|
-
pkey = PEM_read_bio_PrivateKey(bio, NULL,
|
371
|
+
pkey = PEM_read_bio_PrivateKey(bio, NULL, password_cb, (void *) password);
|
267
372
|
|
268
|
-
SSL_CTX_use_PrivateKey(ctx, pkey)
|
373
|
+
if (SSL_CTX_use_PrivateKey(ctx, pkey) != 1) {
|
374
|
+
BIO_free(bio);
|
375
|
+
raise_file_error("SSL_CTX_use_PrivateKey", RSTRING_PTR(key_pem));
|
376
|
+
}
|
377
|
+
EVP_PKEY_free(pkey);
|
378
|
+
BIO_free(bio);
|
269
379
|
}
|
270
380
|
|
271
381
|
verification_flags = rb_funcall(mini_ssl_ctx, rb_intern_const("verification_flags"), 0);
|
@@ -278,7 +388,9 @@ sslctx_initialize(VALUE self, VALUE mini_ssl_ctx) {
|
|
278
388
|
|
279
389
|
if (!NIL_P(ca)) {
|
280
390
|
StringValue(ca);
|
281
|
-
SSL_CTX_load_verify_locations(ctx, RSTRING_PTR(ca), NULL)
|
391
|
+
if (SSL_CTX_load_verify_locations(ctx, RSTRING_PTR(ca), NULL) != 1) {
|
392
|
+
raise_file_error("SSL_CTX_load_verify_locations", RSTRING_PTR(ca));
|
393
|
+
}
|
282
394
|
}
|
283
395
|
|
284
396
|
ssl_options = SSL_OP_CIPHER_SERVER_PREFERENCE | SSL_OP_SINGLE_ECDH_USE | SSL_OP_NO_COMPRESSION;
|
@@ -296,8 +408,6 @@ sslctx_initialize(VALUE self, VALUE mini_ssl_ctx) {
|
|
296
408
|
|
297
409
|
SSL_CTX_set_min_proto_version(ctx, min);
|
298
410
|
|
299
|
-
SSL_CTX_set_options(ctx, ssl_options);
|
300
|
-
|
301
411
|
#else
|
302
412
|
/* As of 1.0.2f, SSL_OP_SINGLE_DH_USE key use is always on */
|
303
413
|
ssl_options |= SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_SINGLE_DH_USE;
|
@@ -308,10 +418,23 @@ sslctx_initialize(VALUE self, VALUE mini_ssl_ctx) {
|
|
308
418
|
if(RTEST(no_tlsv1_1)) {
|
309
419
|
ssl_options |= SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1;
|
310
420
|
}
|
311
|
-
SSL_CTX_set_options(ctx, ssl_options);
|
312
421
|
#endif
|
313
422
|
|
314
|
-
|
423
|
+
#ifdef HAVE_SSL_CTX_SET_SESSION_CACHE_MODE
|
424
|
+
if (!NIL_P(reuse)) {
|
425
|
+
SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_SERVER);
|
426
|
+
if (!NIL_P(reuse_cache_size)) {
|
427
|
+
SSL_CTX_sess_set_cache_size(ctx, NUM2INT(reuse_cache_size));
|
428
|
+
}
|
429
|
+
if (!NIL_P(reuse_timeout)) {
|
430
|
+
SSL_CTX_set_timeout(ctx, NUM2INT(reuse_timeout));
|
431
|
+
}
|
432
|
+
} else {
|
433
|
+
SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_OFF);
|
434
|
+
}
|
435
|
+
#endif
|
436
|
+
|
437
|
+
SSL_CTX_set_options(ctx, ssl_options);
|
315
438
|
|
316
439
|
if (!NIL_P(ssl_cipher_filter)) {
|
317
440
|
StringValue(ssl_cipher_filter);
|
@@ -322,8 +445,7 @@ sslctx_initialize(VALUE self, VALUE mini_ssl_ctx) {
|
|
322
445
|
}
|
323
446
|
|
324
447
|
#if OPENSSL_VERSION_NUMBER < 0x10002000L
|
325
|
-
// Remove this case if OpenSSL 1.0.1 (now EOL) support is no
|
326
|
-
// longer needed.
|
448
|
+
// Remove this case if OpenSSL 1.0.1 (now EOL) support is no longer needed.
|
327
449
|
ecdh = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
|
328
450
|
if (ecdh) {
|
329
451
|
SSL_CTX_set_tmp_ecdh(ctx, ecdh);
|
@@ -355,7 +477,7 @@ sslctx_initialize(VALUE self, VALUE mini_ssl_ctx) {
|
|
355
477
|
|
356
478
|
// printf("\ninitialize end security_level %d\n", SSL_CTX_get_security_level(ctx));
|
357
479
|
|
358
|
-
#ifdef
|
480
|
+
#ifdef HAVE_SSL_CTX_SET_DH_AUTO
|
359
481
|
// https://www.openssl.org/docs/man3.0/man3/SSL_CTX_set_dh_auto.html
|
360
482
|
SSL_CTX_set_dh_auto(ctx, 1);
|
361
483
|
#else
|
@@ -424,7 +546,7 @@ NORETURN(void raise_error(SSL* ssl, int result));
|
|
424
546
|
|
425
547
|
void raise_error(SSL* ssl, int result) {
|
426
548
|
char buf[512];
|
427
|
-
char msg[
|
549
|
+
char msg[768];
|
428
550
|
const char* err_str;
|
429
551
|
int err = errno;
|
430
552
|
int mask = 4095;
|
@@ -682,6 +804,10 @@ void Init_mini_ssl(VALUE puma) {
|
|
682
804
|
|
683
805
|
rb_define_method(eng, "init?", engine_init, 0);
|
684
806
|
|
807
|
+
/* @!attribute [r] peercert
|
808
|
+
* Returns `nil` when `MiniSSL::Context#verify_mode` is set to `VERIFY_NONE`.
|
809
|
+
* @return [String, nil] DER encoded cert
|
810
|
+
*/
|
685
811
|
rb_define_method(eng, "peercert", engine_peercert, 0);
|
686
812
|
|
687
813
|
rb_define_method(eng, "ssl_vers_st", engine_ssl_vers_st, 0);
|
File without changes
|
@@ -46,7 +46,7 @@ public class Http11 extends RubyObject {
|
|
46
46
|
public static final ByteList FRAGMENT_BYTELIST = new ByteList(ByteList.plain("FRAGMENT"));
|
47
47
|
public static final ByteList REQUEST_PATH_BYTELIST = new ByteList(ByteList.plain("REQUEST_PATH"));
|
48
48
|
public static final ByteList QUERY_STRING_BYTELIST = new ByteList(ByteList.plain("QUERY_STRING"));
|
49
|
-
public static final ByteList
|
49
|
+
public static final ByteList SERVER_PROTOCOL_BYTELIST = new ByteList(ByteList.plain("SERVER_PROTOCOL"));
|
50
50
|
|
51
51
|
private static ObjectAllocator ALLOCATOR = new ObjectAllocator() {
|
52
52
|
public IRubyObject allocate(Ruby runtime, RubyClass klass) {
|
@@ -153,9 +153,9 @@ public class Http11 extends RubyObject {
|
|
153
153
|
req.fastASet(RubyString.newStringShared(runtime, QUERY_STRING_BYTELIST),val);
|
154
154
|
}
|
155
155
|
|
156
|
-
public static void
|
156
|
+
public static void server_protocol(Ruby runtime, RubyHash req, ByteList buffer, int at, int length) {
|
157
157
|
RubyString val = RubyString.newString(runtime,new ByteList(buffer,at,length));
|
158
|
-
req.fastASet(RubyString.newStringShared(runtime,
|
158
|
+
req.fastASet(RubyString.newStringShared(runtime, SERVER_PROTOCOL_BYTELIST),val);
|
159
159
|
}
|
160
160
|
|
161
161
|
public void header_done(Ruby runtime, RubyHash req, ByteList buffer, int at, int length) {
|
@@ -383,7 +383,7 @@ case 1:
|
|
383
383
|
case 11:
|
384
384
|
// line 42 "ext/puma_http11/http11_parser.java.rl"
|
385
385
|
{
|
386
|
-
Http11.
|
386
|
+
Http11.server_protocol(runtime, parser.data, parser.buffer, parser.mark, p-parser.mark);
|
387
387
|
}
|
388
388
|
break;
|
389
389
|
case 12:
|