puma 5.3.2 → 5.6.9

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 (49) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +216 -11
  3. data/README.md +47 -6
  4. data/docs/architecture.md +49 -16
  5. data/docs/compile_options.md +4 -2
  6. data/docs/deployment.md +53 -67
  7. data/docs/plugins.md +15 -15
  8. data/docs/rails_dev_mode.md +2 -3
  9. data/docs/restart.md +6 -6
  10. data/docs/signals.md +11 -10
  11. data/docs/stats.md +8 -8
  12. data/docs/systemd.md +64 -67
  13. data/ext/puma_http11/extconf.rb +34 -6
  14. data/ext/puma_http11/http11_parser.c +23 -10
  15. data/ext/puma_http11/http11_parser_common.rl +1 -1
  16. data/ext/puma_http11/mini_ssl.c +90 -12
  17. data/ext/puma_http11/org/jruby/puma/Http11.java +2 -0
  18. data/ext/puma_http11/org/jruby/puma/Http11Parser.java +49 -47
  19. data/ext/puma_http11/org/jruby/puma/MiniSSL.java +38 -55
  20. data/ext/puma_http11/puma_http11.c +1 -1
  21. data/lib/puma/app/status.rb +7 -4
  22. data/lib/puma/binder.rb +51 -6
  23. data/lib/puma/cli.rb +14 -4
  24. data/lib/puma/client.rb +143 -25
  25. data/lib/puma/cluster/worker.rb +8 -18
  26. data/lib/puma/cluster/worker_handle.rb +4 -0
  27. data/lib/puma/cluster.rb +30 -24
  28. data/lib/puma/configuration.rb +4 -1
  29. data/lib/puma/const.rb +17 -8
  30. data/lib/puma/control_cli.rb +19 -13
  31. data/lib/puma/detect.rb +8 -2
  32. data/lib/puma/dsl.rb +111 -13
  33. data/lib/puma/{json.rb → json_serialization.rb} +1 -1
  34. data/lib/puma/launcher.rb +15 -1
  35. data/lib/puma/minissl/context_builder.rb +8 -6
  36. data/lib/puma/minissl.rb +33 -27
  37. data/lib/puma/null_io.rb +5 -0
  38. data/lib/puma/plugin.rb +2 -2
  39. data/lib/puma/rack/builder.rb +1 -1
  40. data/lib/puma/request.rb +35 -13
  41. data/lib/puma/runner.rb +22 -8
  42. data/lib/puma/server.rb +37 -29
  43. data/lib/puma/state_file.rb +42 -7
  44. data/lib/puma/thread_pool.rb +7 -5
  45. data/lib/puma/util.rb +20 -4
  46. data/lib/puma.rb +6 -4
  47. data/lib/rack/version_restriction.rb +15 -0
  48. data/tools/Dockerfile +1 -1
  49. metadata +8 -7
@@ -9,11 +9,22 @@ if $mingw && RUBY_VERSION >= '2.4'
9
9
  end
10
10
 
11
11
  unless ENV["DISABLE_SSL"]
12
- dir_config("openssl")
12
+ # don't use pkg_config('openssl') if '--with-openssl-dir' is used
13
+ has_openssl_dir = dir_config('openssl').any?
14
+ found_pkg_config = !has_openssl_dir && pkg_config('openssl')
13
15
 
14
- if %w'crypto libeay32'.find {|crypto| have_library(crypto, 'BIO_read')} and
16
+ found_ssl = if (!$mingw || RUBY_VERSION >= '2.4') && found_pkg_config
17
+ puts 'using OpenSSL pkgconfig (openssl.pc)'
18
+ true
19
+ elsif %w'crypto libeay32'.find {|crypto| have_library(crypto, 'BIO_read')} &&
15
20
  %w'ssl ssleay32'.find {|ssl| have_library(ssl, 'SSL_CTX_new')}
21
+ true
22
+ else
23
+ puts '** Puma will be compiled without SSL support'
24
+ false
25
+ end
16
26
 
27
+ if found_ssl
17
28
  have_header "openssl/bio.h"
18
29
 
19
30
  # below is yes for 1.0.2 & later
@@ -24,18 +35,35 @@ unless ENV["DISABLE_SSL"]
24
35
  have_func "SSL_CTX_set_min_proto_version(NULL, 0)", "openssl/ssl.h"
25
36
 
26
37
  have_func "X509_STORE_up_ref"
27
- have_func("SSL_CTX_set_ecdh_auto(NULL, 0)", "openssl/ssl.h")
38
+ have_func "SSL_CTX_set_ecdh_auto(NULL, 0)" , "openssl/ssl.h"
39
+
40
+ # below exists in 1.1.0 and later, but isn't documented until 3.0.0
41
+ have_func "SSL_CTX_set_dh_auto(NULL, 0)" , "openssl/ssl.h"
42
+
43
+ # below is yes for 3.0.0 & later
44
+ have_func "SSL_get1_peer_certificate" , "openssl/ssl.h"
45
+
46
+ # Random.bytes available in Ruby 2.5 and later, Random::DEFAULT deprecated in 3.0
47
+ if Random.respond_to?(:bytes)
48
+ $defs.push "-DHAVE_RANDOM_BYTES"
49
+ puts "checking for Random.bytes... yes"
50
+ else
51
+ puts "checking for Random.bytes... no"
52
+ end
28
53
  end
29
54
  end
30
55
 
31
56
  if ENV["MAKE_WARNINGS_INTO_ERRORS"]
32
57
  # Make all warnings into errors
33
58
  # Except `implicit-fallthrough` since most failures comes from ragel state machine generated code
34
- if respond_to? :append_cflags
35
- append_cflags config_string 'WERRORFLAG'
59
+ if respond_to?(:append_cflags, true) # Ruby 2.5 and later
60
+ append_cflags(config_string('WERRORFLAG') || '-Werror')
36
61
  append_cflags '-Wno-implicit-fallthrough'
37
62
  else
38
- $CFLAGS += ' ' << (config_string 'WERRORFLAG') << ' -Wno-implicit-fallthrough'
63
+ # flag may not exist on some platforms, -Werror may not be defined on some platforms, but
64
+ # works with all in current CI
65
+ $CFLAGS << " #{config_string('WERRORFLAG') || '-Werror'}"
66
+ $CFLAGS << ' -Wno-implicit-fallthrough'
39
67
  end
40
68
  end
41
69
 
@@ -428,7 +428,13 @@ case 18:
428
428
  switch( (*p) ) {
429
429
  case 13: goto tr26;
430
430
  case 32: goto tr27;
431
+ case 127: goto st0;
431
432
  }
433
+ if ( (*p) > 8 ) {
434
+ if ( 10 <= (*p) && (*p) <= 31 )
435
+ goto st0;
436
+ } else if ( (*p) >= 0 )
437
+ goto st0;
432
438
  goto tr25;
433
439
  tr25:
434
440
  #line 46 "ext/puma_http11/http11_parser.rl"
@@ -438,9 +444,16 @@ st19:
438
444
  if ( ++p == pe )
439
445
  goto _test_eof19;
440
446
  case 19:
441
- #line 442 "ext/puma_http11/http11_parser.c"
442
- if ( (*p) == 13 )
443
- goto tr29;
447
+ #line 448 "ext/puma_http11/http11_parser.c"
448
+ switch( (*p) ) {
449
+ case 13: goto tr29;
450
+ case 127: goto st0;
451
+ }
452
+ if ( (*p) > 8 ) {
453
+ if ( 10 <= (*p) && (*p) <= 31 )
454
+ goto st0;
455
+ } else if ( (*p) >= 0 )
456
+ goto st0;
444
457
  goto st19;
445
458
  tr9:
446
459
  #line 53 "ext/puma_http11/http11_parser.rl"
@@ -484,7 +497,7 @@ st20:
484
497
  if ( ++p == pe )
485
498
  goto _test_eof20;
486
499
  case 20:
487
- #line 488 "ext/puma_http11/http11_parser.c"
500
+ #line 501 "ext/puma_http11/http11_parser.c"
488
501
  switch( (*p) ) {
489
502
  case 32: goto tr31;
490
503
  case 60: goto st0;
@@ -505,7 +518,7 @@ st21:
505
518
  if ( ++p == pe )
506
519
  goto _test_eof21;
507
520
  case 21:
508
- #line 509 "ext/puma_http11/http11_parser.c"
521
+ #line 522 "ext/puma_http11/http11_parser.c"
509
522
  switch( (*p) ) {
510
523
  case 32: goto tr33;
511
524
  case 60: goto st0;
@@ -526,7 +539,7 @@ st22:
526
539
  if ( ++p == pe )
527
540
  goto _test_eof22;
528
541
  case 22:
529
- #line 530 "ext/puma_http11/http11_parser.c"
542
+ #line 543 "ext/puma_http11/http11_parser.c"
530
543
  switch( (*p) ) {
531
544
  case 43: goto st22;
532
545
  case 58: goto st23;
@@ -551,7 +564,7 @@ st23:
551
564
  if ( ++p == pe )
552
565
  goto _test_eof23;
553
566
  case 23:
554
- #line 555 "ext/puma_http11/http11_parser.c"
567
+ #line 568 "ext/puma_http11/http11_parser.c"
555
568
  switch( (*p) ) {
556
569
  case 32: goto tr8;
557
570
  case 34: goto st0;
@@ -571,7 +584,7 @@ st24:
571
584
  if ( ++p == pe )
572
585
  goto _test_eof24;
573
586
  case 24:
574
- #line 575 "ext/puma_http11/http11_parser.c"
587
+ #line 588 "ext/puma_http11/http11_parser.c"
575
588
  switch( (*p) ) {
576
589
  case 32: goto tr37;
577
590
  case 34: goto st0;
@@ -594,7 +607,7 @@ st25:
594
607
  if ( ++p == pe )
595
608
  goto _test_eof25;
596
609
  case 25:
597
- #line 598 "ext/puma_http11/http11_parser.c"
610
+ #line 611 "ext/puma_http11/http11_parser.c"
598
611
  switch( (*p) ) {
599
612
  case 32: goto tr41;
600
613
  case 34: goto st0;
@@ -614,7 +627,7 @@ st26:
614
627
  if ( ++p == pe )
615
628
  goto _test_eof26;
616
629
  case 26:
617
- #line 618 "ext/puma_http11/http11_parser.c"
630
+ #line 631 "ext/puma_http11/http11_parser.c"
618
631
  switch( (*p) ) {
619
632
  case 32: goto tr44;
620
633
  case 34: goto st0;
@@ -43,7 +43,7 @@
43
43
 
44
44
  field_name = ( token -- ":" )+ >start_field $snake_upcase_field %write_field;
45
45
 
46
- field_value = any* >start_value %write_value;
46
+ field_value = ( (any -- CTL) | "\t" )* >start_value %write_value;
47
47
 
48
48
  message_header = field_name ":" " "* field_value :> CRLF;
49
49
 
@@ -30,6 +30,12 @@ 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
+
33
39
  void engine_free(void *ptr) {
34
40
  ms_conn *conn = ptr;
35
41
  ms_cert_buf* cert_buf = (ms_cert_buf*)SSL_get_app_data(conn->ssl);
@@ -49,7 +55,8 @@ const rb_data_type_t engine_data_type = {
49
55
  0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
50
56
  };
51
57
 
52
- DH *get_dh2048() {
58
+ #ifndef HAVE_SSL_CTX_SET_DH_AUTO
59
+ DH *get_dh2048(void) {
53
60
  /* `openssl dhparam -C 2048`
54
61
  * -----BEGIN DH PARAMETERS-----
55
62
  * MIIBCAKCAQEAjmh1uQHdTfxOyxEbKAV30fUfzqMDF/ChPzjfyzl2jcrqQMhrk76o
@@ -91,13 +98,13 @@ DH *get_dh2048() {
91
98
  static unsigned char dh2048_g[] = { 0x02 };
92
99
 
93
100
  DH *dh;
94
- #if !(OPENSSL_VERSION_NUMBER < 0x10100005L || defined(LIBRESSL_VERSION_NUMBER))
101
+ #if !(OPENSSL_VERSION_NUMBER < 0x10100005L)
95
102
  BIGNUM *p, *g;
96
103
  #endif
97
104
 
98
105
  dh = DH_new();
99
106
 
100
- #if OPENSSL_VERSION_NUMBER < 0x10100005L || defined(LIBRESSL_VERSION_NUMBER)
107
+ #if OPENSSL_VERSION_NUMBER < 0x10100005L
101
108
  dh->p = BN_bin2bn(dh2048_p, sizeof(dh2048_p), NULL);
102
109
  dh->g = BN_bin2bn(dh2048_g, sizeof(dh2048_g), NULL);
103
110
 
@@ -119,6 +126,7 @@ DH *get_dh2048() {
119
126
 
120
127
  return dh;
121
128
  }
129
+ #endif
122
130
 
123
131
  static void
124
132
  sslctx_free(void *ptr) {
@@ -208,8 +216,13 @@ sslctx_initialize(VALUE self, VALUE mini_ssl_ctx) {
208
216
  #endif
209
217
  int ssl_options;
210
218
  VALUE key, cert, ca, verify_mode, ssl_cipher_filter, no_tlsv1, no_tlsv1_1,
211
- verification_flags;
219
+ verification_flags, session_id_bytes, cert_pem, key_pem;
220
+ #ifndef HAVE_SSL_CTX_SET_DH_AUTO
212
221
  DH *dh;
222
+ #endif
223
+ BIO *bio;
224
+ X509 *x509;
225
+ EVP_PKEY *pkey;
213
226
 
214
227
  #if OPENSSL_VERSION_NUMBER < 0x10002000L
215
228
  EC_KEY *ecdh;
@@ -218,13 +231,15 @@ sslctx_initialize(VALUE self, VALUE mini_ssl_ctx) {
218
231
  TypedData_Get_Struct(self, SSL_CTX, &sslctx_type, ctx);
219
232
 
220
233
  key = rb_funcall(mini_ssl_ctx, rb_intern_const("key"), 0);
221
- StringValue(key);
222
234
 
223
235
  cert = rb_funcall(mini_ssl_ctx, rb_intern_const("cert"), 0);
224
- StringValue(cert);
225
236
 
226
237
  ca = rb_funcall(mini_ssl_ctx, rb_intern_const("ca"), 0);
227
238
 
239
+ cert_pem = rb_funcall(mini_ssl_ctx, rb_intern_const("cert_pem"), 0);
240
+
241
+ key_pem = rb_funcall(mini_ssl_ctx, rb_intern_const("key_pem"), 0);
242
+
228
243
  verify_mode = rb_funcall(mini_ssl_ctx, rb_intern_const("verify_mode"), 0);
229
244
 
230
245
  ssl_cipher_filter = rb_funcall(mini_ssl_ctx, rb_intern_const("ssl_cipher_filter"), 0);
@@ -233,8 +248,41 @@ sslctx_initialize(VALUE self, VALUE mini_ssl_ctx) {
233
248
 
234
249
  no_tlsv1_1 = rb_funcall(mini_ssl_ctx, rb_intern_const("no_tlsv1_1"), 0);
235
250
 
236
- SSL_CTX_use_certificate_chain_file(ctx, RSTRING_PTR(cert));
237
- SSL_CTX_use_PrivateKey_file(ctx, RSTRING_PTR(key), SSL_FILETYPE_PEM);
251
+ if (!NIL_P(cert)) {
252
+ StringValue(cert);
253
+
254
+ if (SSL_CTX_use_certificate_chain_file(ctx, RSTRING_PTR(cert)) != 1) {
255
+ raise_file_error("SSL_CTX_use_certificate_chain_file", RSTRING_PTR(cert));
256
+ }
257
+ }
258
+
259
+ if (!NIL_P(key)) {
260
+ StringValue(key);
261
+
262
+ if (SSL_CTX_use_PrivateKey_file(ctx, RSTRING_PTR(key), SSL_FILETYPE_PEM) != 1) {
263
+ raise_file_error("SSL_CTX_use_PrivateKey_file", RSTRING_PTR(key));
264
+ }
265
+ }
266
+
267
+ if (!NIL_P(cert_pem)) {
268
+ bio = BIO_new(BIO_s_mem());
269
+ BIO_puts(bio, RSTRING_PTR(cert_pem));
270
+ x509 = PEM_read_bio_X509(bio, NULL, NULL, NULL);
271
+
272
+ if (SSL_CTX_use_certificate(ctx, x509) != 1) {
273
+ raise_file_error("SSL_CTX_use_certificate", RSTRING_PTR(cert_pem));
274
+ }
275
+ }
276
+
277
+ if (!NIL_P(key_pem)) {
278
+ bio = BIO_new(BIO_s_mem());
279
+ BIO_puts(bio, RSTRING_PTR(key_pem));
280
+ pkey = PEM_read_bio_PrivateKey(bio, NULL, NULL, NULL);
281
+
282
+ if (SSL_CTX_use_PrivateKey(ctx, pkey) != 1) {
283
+ raise_file_error("SSL_CTX_use_PrivateKey", RSTRING_PTR(key_pem));
284
+ }
285
+ }
238
286
 
239
287
  verification_flags = rb_funcall(mini_ssl_ctx, rb_intern_const("verification_flags"), 0);
240
288
 
@@ -246,7 +294,9 @@ sslctx_initialize(VALUE self, VALUE mini_ssl_ctx) {
246
294
 
247
295
  if (!NIL_P(ca)) {
248
296
  StringValue(ca);
249
- SSL_CTX_load_verify_locations(ctx, RSTRING_PTR(ca), NULL);
297
+ if (SSL_CTX_load_verify_locations(ctx, RSTRING_PTR(ca), NULL) != 1) {
298
+ raise_file_error("SSL_CTX_load_verify_locations", RSTRING_PTR(ca));
299
+ }
250
300
  }
251
301
 
252
302
  ssl_options = SSL_OP_CIPHER_SERVER_PREFERENCE | SSL_OP_SINGLE_ECDH_USE | SSL_OP_NO_COMPRESSION;
@@ -289,9 +339,6 @@ sslctx_initialize(VALUE self, VALUE mini_ssl_ctx) {
289
339
  SSL_CTX_set_cipher_list(ctx, "HIGH:!aNULL@STRENGTH");
290
340
  }
291
341
 
292
- dh = get_dh2048();
293
- SSL_CTX_set_tmp_dh(ctx, dh);
294
-
295
342
  #if OPENSSL_VERSION_NUMBER < 0x10002000L
296
343
  // Remove this case if OpenSSL 1.0.1 (now EOL) support is no
297
344
  // longer needed.
@@ -309,7 +356,31 @@ sslctx_initialize(VALUE self, VALUE mini_ssl_ctx) {
309
356
  } else {
310
357
  SSL_CTX_set_verify(ctx, NUM2INT(verify_mode), engine_verify_callback);
311
358
  }
359
+
360
+ // Random.bytes available in Ruby 2.5 and later, Random::DEFAULT deprecated in 3.0
361
+ session_id_bytes = rb_funcall(
362
+ #ifdef HAVE_RANDOM_BYTES
363
+ rb_cRandom,
364
+ #else
365
+ rb_const_get(rb_cRandom, rb_intern_const("DEFAULT")),
366
+ #endif
367
+ rb_intern_const("bytes"),
368
+ 1, ULL2NUM(SSL_MAX_SSL_SESSION_ID_LENGTH));
369
+
370
+ SSL_CTX_set_session_id_context(ctx,
371
+ (unsigned char *) RSTRING_PTR(session_id_bytes),
372
+ SSL_MAX_SSL_SESSION_ID_LENGTH);
373
+
312
374
  // printf("\ninitialize end security_level %d\n", SSL_CTX_get_security_level(ctx));
375
+
376
+ #ifdef HAVE_SSL_CTX_SET_DH_AUTO
377
+ // https://www.openssl.org/docs/man3.0/man3/SSL_CTX_set_dh_auto.html
378
+ SSL_CTX_set_dh_auto(ctx, 1);
379
+ #else
380
+ dh = get_dh2048();
381
+ SSL_CTX_set_tmp_dh(ctx, dh);
382
+ #endif
383
+
313
384
  rb_obj_freeze(self);
314
385
  return self;
315
386
  }
@@ -508,7 +579,11 @@ VALUE engine_peercert(VALUE self) {
508
579
 
509
580
  TypedData_Get_Struct(self, ms_conn, &engine_data_type, conn);
510
581
 
582
+ #ifdef HAVE_SSL_GET1_PEER_CERTIFICATE
583
+ cert = SSL_get1_peer_certificate(conn->ssl);
584
+ #else
511
585
  cert = SSL_get_peer_certificate(conn->ssl);
586
+ #endif
512
587
  if(!cert) {
513
588
  /*
514
589
  * See if there was a failed certificate associated with this client.
@@ -565,7 +640,10 @@ void Init_mini_ssl(VALUE puma) {
565
640
  ERR_load_crypto_strings();
566
641
 
567
642
  mod = rb_define_module_under(puma, "MiniSSL");
643
+
568
644
  eng = rb_define_class_under(mod, "Engine", rb_cObject);
645
+ rb_undef_alloc_func(eng);
646
+
569
647
  sslctx = rb_define_class_under(mod, "SSLContext", rb_cObject);
570
648
  rb_define_alloc_func(sslctx, sslctx_alloc);
571
649
  rb_define_method(sslctx, "initialize", sslctx_initialize, 1);
@@ -99,6 +99,8 @@ public class Http11 extends RubyObject {
99
99
  int bite = b.get(i) & 0xFF;
100
100
  if(bite == '-') {
101
101
  b.set(i, (byte)'_');
102
+ } else if(bite == '_') {
103
+ b.set(i, (byte)',');
102
104
  } else {
103
105
  b.set(i, (byte)Character.toUpperCase(bite));
104
106
  }
@@ -34,9 +34,9 @@ private static short[] init__puma_parser_key_offsets_0()
34
34
  {
35
35
  return new short [] {
36
36
  0, 0, 8, 17, 27, 29, 30, 31, 32, 33, 34, 36,
37
- 39, 41, 44, 45, 61, 62, 78, 80, 81, 89, 97, 107,
38
- 115, 124, 132, 140, 149, 158, 167, 176, 185, 194, 203, 212,
39
- 221, 230, 239, 248, 257, 266, 275, 284, 293, 302, 303
37
+ 39, 41, 44, 45, 61, 62, 78, 85, 91, 99, 107, 117,
38
+ 125, 134, 142, 150, 159, 168, 177, 186, 195, 204, 213, 222,
39
+ 231, 240, 249, 258, 267, 276, 285, 294, 303, 312, 313
40
40
  };
41
41
  }
42
42
 
@@ -52,26 +52,27 @@ private static char[] init__puma_parser_trans_keys_0()
52
52
  46, 48, 57, 48, 57, 13, 48, 57, 10, 13, 33, 124,
53
53
  126, 35, 39, 42, 43, 45, 46, 48, 57, 65, 90, 94,
54
54
  122, 10, 33, 58, 124, 126, 35, 39, 42, 43, 45, 46,
55
- 48, 57, 65, 90, 94, 122, 13, 32, 13, 32, 60, 62,
56
- 127, 0, 31, 34, 35, 32, 60, 62, 127, 0, 31, 34,
57
- 35, 43, 58, 45, 46, 48, 57, 65, 90, 97, 122, 32,
58
- 34, 35, 60, 62, 127, 0, 31, 32, 34, 35, 60, 62,
59
- 63, 127, 0, 31, 32, 34, 35, 60, 62, 127, 0, 31,
60
- 32, 34, 35, 60, 62, 127, 0, 31, 32, 36, 95, 45,
61
- 46, 48, 57, 65, 90, 32, 36, 95, 45, 46, 48, 57,
62
- 65, 90, 32, 36, 95, 45, 46, 48, 57, 65, 90, 32,
63
- 36, 95, 45, 46, 48, 57, 65, 90, 32, 36, 95, 45,
64
- 46, 48, 57, 65, 90, 32, 36, 95, 45, 46, 48, 57,
65
- 65, 90, 32, 36, 95, 45, 46, 48, 57, 65, 90, 32,
66
- 36, 95, 45, 46, 48, 57, 65, 90, 32, 36, 95, 45,
67
- 46, 48, 57, 65, 90, 32, 36, 95, 45, 46, 48, 57,
68
- 65, 90, 32, 36, 95, 45, 46, 48, 57, 65, 90, 32,
69
- 36, 95, 45, 46, 48, 57, 65, 90, 32, 36, 95, 45,
70
- 46, 48, 57, 65, 90, 32, 36, 95, 45, 46, 48, 57,
71
- 65, 90, 32, 36, 95, 45, 46, 48, 57, 65, 90, 32,
72
- 36, 95, 45, 46, 48, 57, 65, 90, 32, 36, 95, 45,
73
- 46, 48, 57, 65, 90, 32, 36, 95, 45, 46, 48, 57,
74
- 65, 90, 32, 0
55
+ 48, 57, 65, 90, 94, 122, 13, 32, 127, 0, 8, 10,
56
+ 31, 13, 127, 0, 8, 10, 31, 32, 60, 62, 127, 0,
57
+ 31, 34, 35, 32, 60, 62, 127, 0, 31, 34, 35, 43,
58
+ 58, 45, 46, 48, 57, 65, 90, 97, 122, 32, 34, 35,
59
+ 60, 62, 127, 0, 31, 32, 34, 35, 60, 62, 63, 127,
60
+ 0, 31, 32, 34, 35, 60, 62, 127, 0, 31, 32, 34,
61
+ 35, 60, 62, 127, 0, 31, 32, 36, 95, 45, 46, 48,
62
+ 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65, 90,
63
+ 32, 36, 95, 45, 46, 48, 57, 65, 90, 32, 36, 95,
64
+ 45, 46, 48, 57, 65, 90, 32, 36, 95, 45, 46, 48,
65
+ 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65, 90,
66
+ 32, 36, 95, 45, 46, 48, 57, 65, 90, 32, 36, 95,
67
+ 45, 46, 48, 57, 65, 90, 32, 36, 95, 45, 46, 48,
68
+ 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65, 90,
69
+ 32, 36, 95, 45, 46, 48, 57, 65, 90, 32, 36, 95,
70
+ 45, 46, 48, 57, 65, 90, 32, 36, 95, 45, 46, 48,
71
+ 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65, 90,
72
+ 32, 36, 95, 45, 46, 48, 57, 65, 90, 32, 36, 95,
73
+ 45, 46, 48, 57, 65, 90, 32, 36, 95, 45, 46, 48,
74
+ 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65, 90,
75
+ 32, 0
75
76
  };
76
77
  }
77
78
 
@@ -82,7 +83,7 @@ private static byte[] init__puma_parser_single_lengths_0()
82
83
  {
83
84
  return new byte [] {
84
85
  0, 2, 3, 4, 2, 1, 1, 1, 1, 1, 0, 1,
85
- 0, 1, 1, 4, 1, 4, 2, 1, 4, 4, 2, 6,
86
+ 0, 1, 1, 4, 1, 4, 3, 2, 4, 4, 2, 6,
86
87
  7, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3,
87
88
  3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 0
88
89
  };
@@ -95,7 +96,7 @@ private static byte[] init__puma_parser_range_lengths_0()
95
96
  {
96
97
  return new byte [] {
97
98
  0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 1, 1,
98
- 1, 1, 0, 6, 0, 6, 0, 0, 2, 2, 4, 1,
99
+ 1, 1, 0, 6, 0, 6, 2, 2, 2, 2, 4, 1,
99
100
  1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3,
100
101
  3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0
101
102
  };
@@ -108,9 +109,9 @@ private static short[] init__puma_parser_index_offsets_0()
108
109
  {
109
110
  return new short [] {
110
111
  0, 0, 6, 13, 21, 24, 26, 28, 30, 32, 34, 36,
111
- 39, 41, 44, 46, 57, 59, 70, 73, 75, 82, 89, 96,
112
- 104, 113, 121, 129, 136, 143, 150, 157, 164, 171, 178, 185,
113
- 192, 199, 206, 213, 220, 227, 234, 241, 248, 255, 257
112
+ 39, 41, 44, 46, 57, 59, 70, 76, 81, 88, 95, 102,
113
+ 110, 119, 127, 135, 142, 149, 156, 163, 170, 177, 184, 191,
114
+ 198, 205, 212, 219, 226, 233, 240, 247, 254, 261, 263
114
115
  };
115
116
  }
116
117
 
@@ -126,22 +127,23 @@ private static byte[] init__puma_parser_indicies_0()
126
127
  16, 15, 1, 17, 1, 18, 17, 1, 19, 1, 20, 21,
127
128
  21, 21, 21, 21, 21, 21, 21, 21, 1, 22, 1, 23,
128
129
  24, 23, 23, 23, 23, 23, 23, 23, 23, 1, 26, 27,
129
- 25, 29, 28, 30, 1, 1, 1, 1, 1, 31, 32, 1,
130
- 1, 1, 1, 1, 33, 34, 35, 34, 34, 34, 34, 1,
131
- 8, 1, 9, 1, 1, 1, 1, 35, 36, 1, 38, 1,
132
- 1, 39, 1, 1, 37, 40, 1, 42, 1, 1, 1, 1,
133
- 41, 43, 1, 45, 1, 1, 1, 1, 44, 2, 46, 46,
134
- 46, 46, 46, 1, 2, 47, 47, 47, 47, 47, 1, 2,
135
- 48, 48, 48, 48, 48, 1, 2, 49, 49, 49, 49, 49,
136
- 1, 2, 50, 50, 50, 50, 50, 1, 2, 51, 51, 51,
137
- 51, 51, 1, 2, 52, 52, 52, 52, 52, 1, 2, 53,
138
- 53, 53, 53, 53, 1, 2, 54, 54, 54, 54, 54, 1,
139
- 2, 55, 55, 55, 55, 55, 1, 2, 56, 56, 56, 56,
140
- 56, 1, 2, 57, 57, 57, 57, 57, 1, 2, 58, 58,
141
- 58, 58, 58, 1, 2, 59, 59, 59, 59, 59, 1, 2,
142
- 60, 60, 60, 60, 60, 1, 2, 61, 61, 61, 61, 61,
143
- 1, 2, 62, 62, 62, 62, 62, 1, 2, 63, 63, 63,
144
- 63, 63, 1, 2, 1, 1, 0
130
+ 1, 1, 1, 25, 29, 1, 1, 1, 28, 30, 1, 1,
131
+ 1, 1, 1, 31, 32, 1, 1, 1, 1, 1, 33, 34,
132
+ 35, 34, 34, 34, 34, 1, 8, 1, 9, 1, 1, 1,
133
+ 1, 35, 36, 1, 38, 1, 1, 39, 1, 1, 37, 40,
134
+ 1, 42, 1, 1, 1, 1, 41, 43, 1, 45, 1, 1,
135
+ 1, 1, 44, 2, 46, 46, 46, 46, 46, 1, 2, 47,
136
+ 47, 47, 47, 47, 1, 2, 48, 48, 48, 48, 48, 1,
137
+ 2, 49, 49, 49, 49, 49, 1, 2, 50, 50, 50, 50,
138
+ 50, 1, 2, 51, 51, 51, 51, 51, 1, 2, 52, 52,
139
+ 52, 52, 52, 1, 2, 53, 53, 53, 53, 53, 1, 2,
140
+ 54, 54, 54, 54, 54, 1, 2, 55, 55, 55, 55, 55,
141
+ 1, 2, 56, 56, 56, 56, 56, 1, 2, 57, 57, 57,
142
+ 57, 57, 1, 2, 58, 58, 58, 58, 58, 1, 2, 59,
143
+ 59, 59, 59, 59, 1, 2, 60, 60, 60, 60, 60, 1,
144
+ 2, 61, 61, 61, 61, 61, 1, 2, 62, 62, 62, 62,
145
+ 62, 1, 2, 63, 63, 63, 63, 63, 1, 2, 1, 1,
146
+ 0
145
147
  };
146
148
  }
147
149
 
@@ -210,7 +212,7 @@ static final int puma_parser_error = 0;
210
212
  cs = 0;
211
213
 
212
214
 
213
- // line 214 "ext/puma_http11/org/jruby/puma/Http11Parser.java"
215
+ // line 216 "ext/puma_http11/org/jruby/puma/Http11Parser.java"
214
216
  {
215
217
  cs = puma_parser_start;
216
218
  }
@@ -242,7 +244,7 @@ static final int puma_parser_error = 0;
242
244
  parser.buffer = buffer;
243
245
 
244
246
 
245
- // line 246 "ext/puma_http11/org/jruby/puma/Http11Parser.java"
247
+ // line 248 "ext/puma_http11/org/jruby/puma/Http11Parser.java"
246
248
  {
247
249
  int _klen;
248
250
  int _trans = 0;
@@ -398,7 +400,7 @@ case 1:
398
400
  { p += 1; _goto_targ = 5; if (true) continue _goto;}
399
401
  }
400
402
  break;
401
- // line 402 "ext/puma_http11/org/jruby/puma/Http11Parser.java"
403
+ // line 404 "ext/puma_http11/org/jruby/puma/Http11Parser.java"
402
404
  }
403
405
  }
404
406
  }