puma 4.3.6 → 4.3.10
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of puma might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/History.md +21 -0
- data/ext/puma_http11/extconf.rb +1 -1
- data/ext/puma_http11/http11_parser.c +23 -10
- data/ext/puma_http11/http11_parser_common.rl +1 -1
- data/ext/puma_http11/org/jruby/puma/Http11Parser.java +48 -46
- data/lib/puma/client.rb +21 -9
- data/lib/puma/const.rb +1 -1
- data/lib/puma/server.rb +14 -9
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b5bada51607a0a6b25db74e4fd87c92bbe5e2fa0b0c5b2e62fbce9976b4ed88b
|
4
|
+
data.tar.gz: 5f7557d5023cced69856a8b8b2dd4532bf4b6a496fef9f9a4de6aa131d03d740
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f393fc0d055ff108e4d98fc3172d356d1f09f9a938f7f3d801c2360b6724e08ae1d60fc8cb77c3140e15a8dfdfc088d477100de1260e9dd61215818f6e576d7e
|
7
|
+
data.tar.gz: 1f4224b7a2cbe85347628f10c4fa8b6e47bd66b9b9e320962a46dc8fcc184420baad3a011c80a52d9f9925cbe4679d8bfde32c28359c9cd9dc36e108af88db3a
|
data/History.md
CHANGED
@@ -1,8 +1,29 @@
|
|
1
|
+
## 4.3.10 / 2021-10-12
|
2
|
+
|
3
|
+
* Bugfixes
|
4
|
+
* Allow UTF-8 in HTTP header values
|
5
|
+
|
6
|
+
## 4.3.9 / 2021-10-12
|
7
|
+
|
8
|
+
* Security
|
9
|
+
* Do not allow LF as a line ending in a header (CVE-2021-41136)
|
10
|
+
|
11
|
+
## 4.3.8 / 2021-05-11
|
12
|
+
|
13
|
+
* Security
|
14
|
+
* Close keepalive connections after the maximum number of fast inlined requests (#2625)
|
15
|
+
|
16
|
+
## 4.3.7 / 2020-11-30
|
17
|
+
|
18
|
+
* Bugfixes
|
19
|
+
* Backport set CONTENT_LENGTH for chunked requests (Originally: #2287, backport: #2496)
|
20
|
+
|
1
21
|
## 4.3.6 / 2020-09-05
|
2
22
|
|
3
23
|
* Bugfixes
|
4
24
|
* Explicitly include ctype.h to fix compilation warning and build error on macOS with Xcode 12 (#2304)
|
5
25
|
* Don't require json at boot (#2269)
|
26
|
+
* Set `CONTENT_LENGTH` for chunked requests (#2287)
|
6
27
|
|
7
28
|
## 4.3.4/4.3.5 and 3.12.5/3.12.6 / 2020-05-22
|
8
29
|
|
data/ext/puma_http11/extconf.rb
CHANGED
@@ -430,7 +430,13 @@ case 18:
|
|
430
430
|
switch( (*p) ) {
|
431
431
|
case 13: goto tr26;
|
432
432
|
case 32: goto tr27;
|
433
|
+
case 127: goto st0;
|
433
434
|
}
|
435
|
+
if ( (*p) > 8 ) {
|
436
|
+
if ( 10 <= (*p) && (*p) <= 31 )
|
437
|
+
goto st0;
|
438
|
+
} else if ( (*p) >= 0 )
|
439
|
+
goto st0;
|
434
440
|
goto tr25;
|
435
441
|
tr25:
|
436
442
|
#line 44 "ext/puma_http11/http11_parser.rl"
|
@@ -440,9 +446,16 @@ st19:
|
|
440
446
|
if ( ++p == pe )
|
441
447
|
goto _test_eof19;
|
442
448
|
case 19:
|
443
|
-
#line
|
444
|
-
|
445
|
-
goto tr29;
|
449
|
+
#line 448 "ext/puma_http11/http11_parser.c"
|
450
|
+
switch( (*p) ) {
|
451
|
+
case 13: goto tr29;
|
452
|
+
case 127: goto st0;
|
453
|
+
}
|
454
|
+
if ( (*p) > 8 ) {
|
455
|
+
if ( 10 <= (*p) && (*p) <= 31 )
|
456
|
+
goto st0;
|
457
|
+
} else if ( (*p) >= 0 )
|
458
|
+
goto st0;
|
446
459
|
goto st19;
|
447
460
|
tr9:
|
448
461
|
#line 51 "ext/puma_http11/http11_parser.rl"
|
@@ -486,7 +499,7 @@ st20:
|
|
486
499
|
if ( ++p == pe )
|
487
500
|
goto _test_eof20;
|
488
501
|
case 20:
|
489
|
-
#line
|
502
|
+
#line 501 "ext/puma_http11/http11_parser.c"
|
490
503
|
switch( (*p) ) {
|
491
504
|
case 32: goto tr31;
|
492
505
|
case 60: goto st0;
|
@@ -507,7 +520,7 @@ st21:
|
|
507
520
|
if ( ++p == pe )
|
508
521
|
goto _test_eof21;
|
509
522
|
case 21:
|
510
|
-
#line
|
523
|
+
#line 522 "ext/puma_http11/http11_parser.c"
|
511
524
|
switch( (*p) ) {
|
512
525
|
case 32: goto tr33;
|
513
526
|
case 60: goto st0;
|
@@ -528,7 +541,7 @@ st22:
|
|
528
541
|
if ( ++p == pe )
|
529
542
|
goto _test_eof22;
|
530
543
|
case 22:
|
531
|
-
#line
|
544
|
+
#line 543 "ext/puma_http11/http11_parser.c"
|
532
545
|
switch( (*p) ) {
|
533
546
|
case 43: goto st22;
|
534
547
|
case 58: goto st23;
|
@@ -553,7 +566,7 @@ st23:
|
|
553
566
|
if ( ++p == pe )
|
554
567
|
goto _test_eof23;
|
555
568
|
case 23:
|
556
|
-
#line
|
569
|
+
#line 568 "ext/puma_http11/http11_parser.c"
|
557
570
|
switch( (*p) ) {
|
558
571
|
case 32: goto tr8;
|
559
572
|
case 34: goto st0;
|
@@ -573,7 +586,7 @@ st24:
|
|
573
586
|
if ( ++p == pe )
|
574
587
|
goto _test_eof24;
|
575
588
|
case 24:
|
576
|
-
#line
|
589
|
+
#line 588 "ext/puma_http11/http11_parser.c"
|
577
590
|
switch( (*p) ) {
|
578
591
|
case 32: goto tr37;
|
579
592
|
case 34: goto st0;
|
@@ -596,7 +609,7 @@ st25:
|
|
596
609
|
if ( ++p == pe )
|
597
610
|
goto _test_eof25;
|
598
611
|
case 25:
|
599
|
-
#line
|
612
|
+
#line 611 "ext/puma_http11/http11_parser.c"
|
600
613
|
switch( (*p) ) {
|
601
614
|
case 32: goto tr41;
|
602
615
|
case 34: goto st0;
|
@@ -616,7 +629,7 @@ st26:
|
|
616
629
|
if ( ++p == pe )
|
617
630
|
goto _test_eof26;
|
618
631
|
case 26:
|
619
|
-
#line
|
632
|
+
#line 631 "ext/puma_http11/http11_parser.c"
|
620
633
|
switch( (*p) ) {
|
621
634
|
case 32: goto tr44;
|
622
635
|
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
|
|
@@ -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,
|
38
|
-
|
39
|
-
|
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,
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
65, 90, 32, 36, 95, 45, 46, 48, 57, 65, 90,
|
63
|
-
36, 95, 45, 46, 48, 57, 65, 90, 32, 36, 95,
|
64
|
-
46, 48, 57, 65, 90, 32, 36, 95, 45, 46, 48,
|
65
|
-
65, 90, 32, 36, 95, 45, 46, 48, 57, 65, 90,
|
66
|
-
36, 95, 45, 46, 48, 57, 65, 90, 32, 36, 95,
|
67
|
-
46, 48, 57, 65, 90, 32, 36, 95, 45, 46, 48,
|
68
|
-
65, 90, 32, 36, 95, 45, 46, 48, 57, 65, 90,
|
69
|
-
36, 95, 45, 46, 48, 57, 65, 90, 32, 36, 95,
|
70
|
-
46, 48, 57, 65, 90, 32, 36, 95, 45, 46, 48,
|
71
|
-
65, 90, 32, 36, 95, 45, 46, 48, 57, 65, 90,
|
72
|
-
36, 95, 45, 46, 48, 57, 65, 90, 32, 36, 95,
|
73
|
-
46, 48, 57, 65, 90, 32, 36, 95, 45, 46, 48,
|
74
|
-
65, 90, 32,
|
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,
|
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,
|
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,
|
112
|
-
|
113
|
-
|
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
|
-
|
130
|
-
1, 1, 1, 1,
|
131
|
-
|
132
|
-
1,
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
63, 63, 1, 2, 1, 1,
|
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
|
|
@@ -217,7 +219,7 @@ static final int puma_parser_en_main = 1;
|
|
217
219
|
cs = puma_parser_start;
|
218
220
|
}
|
219
221
|
|
220
|
-
// line
|
222
|
+
// line 88 "ext/puma_http11/http11_parser.java.rl"
|
221
223
|
|
222
224
|
body_start = 0;
|
223
225
|
content_len = 0;
|
@@ -420,7 +422,7 @@ case 5:
|
|
420
422
|
break; }
|
421
423
|
}
|
422
424
|
|
423
|
-
// line
|
425
|
+
// line 114 "ext/puma_http11/http11_parser.java.rl"
|
424
426
|
|
425
427
|
parser.cs = cs;
|
426
428
|
parser.nread += (p - off);
|
data/lib/puma/client.rb
CHANGED
@@ -153,7 +153,7 @@ module Puma
|
|
153
153
|
|
154
154
|
begin
|
155
155
|
data = @io.read_nonblock(CHUNK_SIZE)
|
156
|
-
rescue
|
156
|
+
rescue IO::WaitReadable
|
157
157
|
return false
|
158
158
|
rescue SystemCallError, IOError, EOFError
|
159
159
|
raise ConnectionError, "Connection error detected during read"
|
@@ -351,7 +351,7 @@ module Puma
|
|
351
351
|
|
352
352
|
begin
|
353
353
|
chunk = @io.read_nonblock(want)
|
354
|
-
rescue
|
354
|
+
rescue IO::WaitReadable
|
355
355
|
return false
|
356
356
|
rescue SystemCallError, IOError
|
357
357
|
raise ConnectionError, "Connection error detected during read"
|
@@ -397,7 +397,10 @@ module Puma
|
|
397
397
|
raise EOFError
|
398
398
|
end
|
399
399
|
|
400
|
-
|
400
|
+
if decode_chunk(chunk)
|
401
|
+
@env[CONTENT_LENGTH] = @chunked_content_length
|
402
|
+
return true
|
403
|
+
end
|
401
404
|
end
|
402
405
|
end
|
403
406
|
|
@@ -410,19 +413,28 @@ module Puma
|
|
410
413
|
@body.binmode
|
411
414
|
@tempfile = @body
|
412
415
|
|
413
|
-
|
416
|
+
@chunked_content_length = 0
|
417
|
+
|
418
|
+
if decode_chunk(body)
|
419
|
+
@env[CONTENT_LENGTH] = @chunked_content_length
|
420
|
+
return true
|
421
|
+
end
|
422
|
+
end
|
423
|
+
|
424
|
+
def write_chunk(str)
|
425
|
+
@chunked_content_length += @body.write(str)
|
414
426
|
end
|
415
427
|
|
416
428
|
def decode_chunk(chunk)
|
417
429
|
if @partial_part_left > 0
|
418
430
|
if @partial_part_left <= chunk.size
|
419
431
|
if @partial_part_left > 2
|
420
|
-
|
432
|
+
write_chunk(chunk[0..(@partial_part_left-3)]) # skip the \r\n
|
421
433
|
end
|
422
434
|
chunk = chunk[@partial_part_left..-1]
|
423
435
|
@partial_part_left = 0
|
424
436
|
else
|
425
|
-
|
437
|
+
write_chunk(chunk) if @partial_part_left > 2 # don't include the last \r\n
|
426
438
|
@partial_part_left -= chunk.size
|
427
439
|
return false
|
428
440
|
end
|
@@ -469,12 +481,12 @@ module Puma
|
|
469
481
|
|
470
482
|
case
|
471
483
|
when got == len
|
472
|
-
|
484
|
+
write_chunk(part[0..-3]) # to skip the ending \r\n
|
473
485
|
when got <= len - 2
|
474
|
-
|
486
|
+
write_chunk(part)
|
475
487
|
@partial_part_left = len - part.size
|
476
488
|
when got == len - 1 # edge where we get just \r but not \n
|
477
|
-
|
489
|
+
write_chunk(part[0..-2])
|
478
490
|
@partial_part_left = len - part.size
|
479
491
|
end
|
480
492
|
else
|
data/lib/puma/const.rb
CHANGED
@@ -100,7 +100,7 @@ module Puma
|
|
100
100
|
# too taxing on performance.
|
101
101
|
module Const
|
102
102
|
|
103
|
-
PUMA_VERSION = VERSION = "4.3.
|
103
|
+
PUMA_VERSION = VERSION = "4.3.10".freeze
|
104
104
|
CODE_NAME = "Mysterious Traveller".freeze
|
105
105
|
PUMA_SERVER_STRING = ['puma', PUMA_VERSION, CODE_NAME].join(' ').freeze
|
106
106
|
|
data/lib/puma/server.rb
CHANGED
@@ -483,15 +483,20 @@ module Puma
|
|
483
483
|
|
484
484
|
requests += 1
|
485
485
|
|
486
|
-
|
486
|
+
# Closing keepalive sockets after they've made a reasonable
|
487
|
+
# number of requests allows Puma to service many connections
|
488
|
+
# fairly, even when the number of concurrent connections exceeds
|
489
|
+
# the size of the threadpool. It also allows cluster mode Pumas
|
490
|
+
# to keep load evenly distributed across workers, because clients
|
491
|
+
# are randomly assigned a new worker when opening a new connection.
|
492
|
+
#
|
493
|
+
# Previously, Puma would kick connections in this conditional back
|
494
|
+
# to the reactor. However, because this causes the todo set to increase
|
495
|
+
# in size, the wait_until_full mutex would never unlock, leaving
|
496
|
+
# any additional connections unserviced.
|
497
|
+
break if requests >= MAX_FAST_INLINE
|
487
498
|
|
488
|
-
|
489
|
-
# This will mean that reset will only try to use the data it already
|
490
|
-
# has buffered and won't try to read more data. What this means is that
|
491
|
-
# every client, independent of their request speed, gets treated like a slow
|
492
|
-
# one once every MAX_FAST_INLINE requests.
|
493
|
-
check_for_more_data = false
|
494
|
-
end
|
499
|
+
check_for_more_data = @status == :run
|
495
500
|
|
496
501
|
unless client.reset(check_for_more_data)
|
497
502
|
close_socket = false
|
@@ -694,7 +699,7 @@ module Puma
|
|
694
699
|
to_add = {}
|
695
700
|
end
|
696
701
|
|
697
|
-
to_add[k.
|
702
|
+
to_add[k.tr(",", "_")] = v
|
698
703
|
end
|
699
704
|
end
|
700
705
|
|
metadata
CHANGED
@@ -1,24 +1,24 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: puma
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.3.
|
4
|
+
version: 4.3.10
|
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: 2021-10-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name: nio4r
|
15
14
|
requirement: !ruby/object:Gem::Requirement
|
16
15
|
requirements:
|
17
16
|
- - "~>"
|
18
17
|
- !ruby/object:Gem::Version
|
19
18
|
version: '2.0'
|
20
|
-
|
19
|
+
name: nio4r
|
21
20
|
prerelease: false
|
21
|
+
type: :runtime
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
@@ -136,7 +136,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
136
136
|
- !ruby/object:Gem::Version
|
137
137
|
version: '0'
|
138
138
|
requirements: []
|
139
|
-
rubygems_version: 3.1.
|
139
|
+
rubygems_version: 3.1.6
|
140
140
|
signing_key:
|
141
141
|
specification_version: 4
|
142
142
|
summary: Puma is a simple, fast, threaded, and highly concurrent HTTP 1.1 server for
|