http-2 1.0.2 → 1.1.1
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 +4 -4
- data/lib/http/2/client.rb +1 -0
- data/lib/http/2/connection.rb +118 -97
- data/lib/http/2/emitter.rb +2 -9
- data/lib/http/2/extensions.rb +21 -1
- data/lib/http/2/flow_buffer.rb +45 -35
- data/lib/http/2/framer.rb +123 -85
- data/lib/http/2/header/compressor.rb +47 -31
- data/lib/http/2/header/decompressor.rb +27 -20
- data/lib/http/2/header/encoding_context.rb +77 -80
- data/lib/http/2/header/huffman.rb +14 -10
- data/lib/http/2/header/huffman_statemachine.rb +1 -1
- data/lib/http/2/server.rb +7 -1
- data/lib/http/2/stream.rb +54 -60
- data/lib/http/2/version.rb +1 -1
- data/lib/http/2.rb +5 -0
- data/sig/{next.rbs → 2.rbs} +29 -18
- data/sig/client.rbs +2 -0
- data/sig/connection.rbs +20 -8
- data/sig/emitter.rbs +2 -4
- data/sig/extensions.rbs +3 -1
- data/sig/flow_buffer.rbs +7 -5
- data/sig/frame_buffer.rbs +1 -1
- data/sig/framer.rbs +5 -0
- data/sig/header/compressor.rbs +6 -4
- data/sig/header/decompressor.rbs +3 -2
- data/sig/header/encoding_context.rbs +24 -6
- data/sig/header/huffman.rbs +19 -3
- data/sig/header.rbs +11 -8
- data/sig/stream.rbs +8 -5
- metadata +4 -7
data/lib/http/2/stream.rb
CHANGED
@@ -40,6 +40,8 @@ module HTTP2
|
|
40
40
|
include Emitter
|
41
41
|
include Error
|
42
42
|
|
43
|
+
STREAM_OPEN_STATES = %i[open half_closed_local half_closing closing].freeze
|
44
|
+
|
43
45
|
# Stream ID (odd for client initiated streams, even otherwise).
|
44
46
|
attr_reader :id
|
45
47
|
|
@@ -80,6 +82,11 @@ module HTTP2
|
|
80
82
|
@id = id
|
81
83
|
@weight = weight
|
82
84
|
@dependency = dependency
|
85
|
+
|
86
|
+
# from mixins
|
87
|
+
@listeners = Hash.new { |hash, key| hash[key] = [] }
|
88
|
+
@send_buffer = FrameBuffer.new
|
89
|
+
|
83
90
|
process_priority(weight: weight, dependency: dependency, exclusive: exclusive)
|
84
91
|
@local_window_max_size = connection.local_settings[:settings_initial_window_size]
|
85
92
|
@local_window = connection.local_settings[:settings_initial_window_size]
|
@@ -88,7 +95,7 @@ module HTTP2
|
|
88
95
|
@state = state
|
89
96
|
@error = false
|
90
97
|
@closed = false
|
91
|
-
@_method = @_content_length = @_status_code = nil
|
98
|
+
@_method = @_content_length = @_status_code = @_trailers = nil
|
92
99
|
@_waiting_on_trailers = false
|
93
100
|
@received_data = false
|
94
101
|
@activated = false
|
@@ -113,9 +120,7 @@ module HTTP2
|
|
113
120
|
# If a DATA frame is received whose stream is not in "open" or
|
114
121
|
# "half closed (local)" state, the recipient MUST respond with a
|
115
122
|
# stream error (Section 5.4.2) of type STREAM_CLOSED.
|
116
|
-
stream_error(:stream_closed) unless @state
|
117
|
-
@state == :half_closed_local ||
|
118
|
-
@state == :half_closing || @state == :closing ||
|
123
|
+
stream_error(:stream_closed) unless STREAM_OPEN_STATES.include?(@state) ||
|
119
124
|
(@state == :closed && @closed == :local_rst)
|
120
125
|
@received_data = true
|
121
126
|
calculate_content_length(frame[:length])
|
@@ -192,21 +197,18 @@ module HTTP2
|
|
192
197
|
#
|
193
198
|
# @param frame [Hash]
|
194
199
|
def send(frame)
|
195
|
-
process_priority(frame) if frame[:type] == :priority
|
196
|
-
|
197
200
|
case frame[:type]
|
198
201
|
when :data
|
199
|
-
#
|
200
|
-
send_data(frame)
|
202
|
+
# stream state management is maintained in send_data
|
203
|
+
return send_data(frame)
|
201
204
|
when :window_update
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
end
|
205
|
+
@local_window += frame[:increment]
|
206
|
+
when :priority
|
207
|
+
process_priority(frame)
|
208
|
+
end
|
209
|
+
|
210
|
+
manage_state(frame) do
|
211
|
+
emit(:frame, frame)
|
210
212
|
end
|
211
213
|
end
|
212
214
|
|
@@ -379,7 +381,7 @@ module HTTP2
|
|
379
381
|
else
|
380
382
|
event(:open)
|
381
383
|
end
|
382
|
-
when :priority
|
384
|
+
when :priority
|
383
385
|
else stream_error(:protocol_error)
|
384
386
|
end
|
385
387
|
end
|
@@ -400,19 +402,20 @@ module HTTP2
|
|
400
402
|
# WINDOW_UPDATE on a stream in this state MUST be treated as a
|
401
403
|
# connection error (Section 5.4.1) of type PROTOCOL_ERROR.
|
402
404
|
when :reserved_local
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
405
|
+
if sending
|
406
|
+
case frame[:type]
|
407
|
+
when :headers then event(:half_closed_remote)
|
408
|
+
when :rst_stream then event(:local_rst)
|
409
|
+
when :priority
|
410
|
+
else stream_error
|
411
|
+
end
|
412
|
+
else
|
413
|
+
case frame[:type]
|
414
|
+
when :rst_stream then event(:remote_rst)
|
415
|
+
when :priority, :window_update
|
416
|
+
else stream_error
|
417
|
+
end
|
418
|
+
end
|
416
419
|
|
417
420
|
# A stream in the "reserved (remote)" state has been reserved by a
|
418
421
|
# remote peer.
|
@@ -429,19 +432,20 @@ module HTTP2
|
|
429
432
|
# PRIORITY on a stream in this state MUST be treated as a connection
|
430
433
|
# error (Section 5.4.1) of type PROTOCOL_ERROR.
|
431
434
|
when :reserved_remote
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
435
|
+
if sending
|
436
|
+
case frame[:type]
|
437
|
+
when :rst_stream then event(:local_rst)
|
438
|
+
when :priority, :window_update
|
439
|
+
else stream_error
|
440
|
+
end
|
441
|
+
else
|
442
|
+
case frame[:type]
|
443
|
+
when :headers then event(:half_closed_local)
|
444
|
+
when :rst_stream then event(:remote_rst)
|
445
|
+
when :priority
|
446
|
+
else stream_error
|
447
|
+
end
|
448
|
+
end
|
445
449
|
|
446
450
|
# A stream in the "open" state may be used by both peers to send
|
447
451
|
# frames of any type. In this state, sending peers observe
|
@@ -460,12 +464,14 @@ module HTTP2
|
|
460
464
|
when :data, :headers, :continuation
|
461
465
|
event(:half_closed_local) if end_stream?(frame)
|
462
466
|
when :rst_stream then event(:local_rst)
|
467
|
+
when :priority
|
463
468
|
end
|
464
469
|
else
|
465
470
|
case frame[:type]
|
466
471
|
when :data, :headers, :continuation
|
467
472
|
event(:half_closed_remote) if end_stream?(frame)
|
468
473
|
when :rst_stream then event(:remote_rst)
|
474
|
+
when :priority
|
469
475
|
end
|
470
476
|
end
|
471
477
|
|
@@ -485,10 +491,7 @@ module HTTP2
|
|
485
491
|
case frame[:type]
|
486
492
|
when :rst_stream
|
487
493
|
event(:local_rst)
|
488
|
-
when :priority
|
489
|
-
process_priority(frame)
|
490
|
-
when :window_update
|
491
|
-
# nop here
|
494
|
+
when :priority, :window_update
|
492
495
|
else
|
493
496
|
stream_error
|
494
497
|
end
|
@@ -497,10 +500,7 @@ module HTTP2
|
|
497
500
|
when :data, :headers, :continuation
|
498
501
|
event(:remote_closed) if end_stream?(frame)
|
499
502
|
when :rst_stream then event(:remote_rst)
|
500
|
-
when :priority
|
501
|
-
process_priority(frame)
|
502
|
-
when :window_update
|
503
|
-
# nop here
|
503
|
+
when :priority, :window_update
|
504
504
|
end
|
505
505
|
end
|
506
506
|
|
@@ -529,9 +529,7 @@ module HTTP2
|
|
529
529
|
else
|
530
530
|
case frame[:type]
|
531
531
|
when :rst_stream then event(:remote_rst)
|
532
|
-
when :priority
|
533
|
-
process_priority(frame)
|
534
|
-
when :window_update
|
532
|
+
when :priority, :window_update
|
535
533
|
# nop
|
536
534
|
else
|
537
535
|
stream_error(:stream_closed)
|
@@ -579,19 +577,15 @@ module HTTP2
|
|
579
577
|
when :closed
|
580
578
|
if sending
|
581
579
|
case frame[:type]
|
582
|
-
when :rst_stream
|
583
|
-
when :priority
|
584
|
-
process_priority(frame)
|
580
|
+
when :rst_stream, :priority
|
585
581
|
else
|
586
582
|
stream_error(:stream_closed) unless frame[:type] == :rst_stream
|
587
583
|
end
|
588
|
-
elsif frame[:type] == :priority
|
589
|
-
process_priority(frame)
|
590
584
|
else
|
591
585
|
case @closed
|
592
586
|
when :remote_rst, :remote_closed
|
593
587
|
case frame[:type]
|
594
|
-
when :rst_stream, :window_update # nop here
|
588
|
+
when :priority, :rst_stream, :window_update # nop here
|
595
589
|
else
|
596
590
|
stream_error(:stream_closed)
|
597
591
|
end
|
data/lib/http/2/version.rb
CHANGED
data/lib/http/2.rb
CHANGED
data/sig/{next.rbs → 2.rbs}
RENAMED
@@ -7,7 +7,18 @@ module HTTP2
|
|
7
7
|
|
8
8
|
DEFAULT_MAX_CONCURRENT_STREAMS: Integer
|
9
9
|
|
10
|
-
|
10
|
+
EMPTY: []
|
11
|
+
|
12
|
+
type connection_opts = Hash[Symbol, untyped]
|
13
|
+
|
14
|
+
type settings_hash = {
|
15
|
+
settings_header_table_size: Integer,
|
16
|
+
settings_enable_push: Integer,
|
17
|
+
settings_max_concurrent_streams: Integer,
|
18
|
+
settings_initial_window_size: Integer,
|
19
|
+
settings_max_frame_size: Integer,
|
20
|
+
settings_max_header_list_size: Integer
|
21
|
+
}
|
11
22
|
|
12
23
|
type settings_ary = Array[settings_enum]
|
13
24
|
|
@@ -30,44 +41,44 @@ module HTTP2
|
|
30
41
|
# # FRAMES
|
31
42
|
type frame_control_flags = Array[:end_headers | :end_stream]
|
32
43
|
|
44
|
+
type common_frame = { stream: Integer }
|
45
|
+
|
33
46
|
# # HEADERS
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
47
|
+
type headers_frame = common_frame & {
|
48
|
+
type: :headers, flags: frame_control_flags, payload: Enumerable[header_pair] | String,
|
49
|
+
?method: Symbol, ?trailer: Array[String], ?content_length: Integer, ?padding: Integer
|
50
|
+
}
|
38
51
|
|
39
52
|
# # DATA
|
40
|
-
type data_frame = { type: :data, flags: frame_control_flags,
|
41
|
-
| { type: :data, flags: frame_control_flags, stream: Integer, length: Integer, payload: String }
|
42
|
-
| { type: :data, flags: frame_control_flags, payload: String }
|
53
|
+
type data_frame = { type: :data, flags: frame_control_flags, ?length: Integer, payload: String, ?padding: Integer }
|
43
54
|
|
44
55
|
# # PUSH_PROMISE
|
45
|
-
|
56
|
+
type push_promise_frame = { type: :push_promise, promise_stream: Integer, flags: frame_control_flags, ?method: Symbol, ?trailer: Array[String], ?content_length: Integer, payload: Enumerable[header_pair], ?padding: Integer }
|
46
57
|
|
47
58
|
# # SETTINGS
|
48
|
-
|
59
|
+
type settings_frame = { type: :settings, payload: Array[[Symbol | Integer, Integer]] }
|
49
60
|
|
50
61
|
# # WINDOW_UPDATE
|
51
|
-
|
62
|
+
type window_update_frame = { type: :window_update, increment: Integer }
|
52
63
|
|
53
64
|
# # PRIORITY
|
54
|
-
type priority_frame = {
|
65
|
+
type priority_frame = { dependency: Integer, exclusive: bool, weight: Integer }
|
55
66
|
|
56
67
|
# # ALTSVC
|
57
|
-
|
68
|
+
type altsvc_frame = { type: :altsvc, max_age: Integer, port: Integer, proto: "String", host: String }
|
58
69
|
|
59
70
|
# # ORIGIN
|
60
|
-
|
71
|
+
type origin_frame = { type: :origin, origin: Array[String] }
|
61
72
|
|
62
73
|
# # PING
|
63
|
-
|
74
|
+
type ping_frame = { type: :ping, payload: String, length: Integer }
|
64
75
|
|
65
76
|
# # GOAWAY
|
66
|
-
|
77
|
+
type goaway_frame = { type: :goaway, last_stream: Integer, error: Symbol? }
|
67
78
|
|
68
|
-
# type frame = headers_frame | data_frame | push_promise_frame |
|
79
|
+
# type frame = common_frame & (headers_frame | data_frame | push_promise_frame |
|
69
80
|
# settings_frame | window_update_frame | priority_frame | altsvc_frame |
|
70
|
-
# origin_frame | ping_frame | goaway_frame
|
81
|
+
# origin_frame | ping_frame | goaway_frame)
|
71
82
|
|
72
83
|
type frame_key = :type | :flags | :stream | :padding | :ignore |
|
73
84
|
# headers
|
data/sig/client.rbs
CHANGED
data/sig/connection.rbs
CHANGED
@@ -5,8 +5,15 @@ module HTTP2
|
|
5
5
|
include BufferUtils
|
6
6
|
|
7
7
|
REQUEST_MANDATORY_HEADERS: Array[String]
|
8
|
+
|
8
9
|
RESPONSE_MANDATORY_HEADERS: Array[String]
|
9
10
|
|
11
|
+
CONNECTION_FRAME_TYPES: Array[Symbol]
|
12
|
+
|
13
|
+
HEADERS_FRAME_TYPES: Array[Symbol]
|
14
|
+
|
15
|
+
STREAM_OPEN_STATES: Array[Symbol]
|
16
|
+
|
10
17
|
attr_reader state: Symbol
|
11
18
|
|
12
19
|
attr_reader local_window: Integer
|
@@ -22,14 +29,18 @@ module HTTP2
|
|
22
29
|
|
23
30
|
@stream_id: Integer
|
24
31
|
@active_stream_count: Integer
|
25
|
-
@last_activated_stream: Integer
|
26
32
|
@last_stream_id: Integer
|
27
33
|
|
28
34
|
@streams: Hash[Integer, Stream]
|
29
|
-
@streams_recently_closed: Hash[Integer,
|
35
|
+
@streams_recently_closed: Hash[Integer, Numeric]
|
30
36
|
|
31
37
|
@framer: Framer
|
32
38
|
|
39
|
+
type role_type = :client | :server
|
40
|
+
|
41
|
+
@local_role: role_type
|
42
|
+
@remote_role: role_type
|
43
|
+
|
33
44
|
@local_window_limit: Integer
|
34
45
|
@remote_window_limit: Integer
|
35
46
|
|
@@ -40,6 +51,7 @@ module HTTP2
|
|
40
51
|
@recv_buffer: String
|
41
52
|
@continuation: Array[frame]
|
42
53
|
|
54
|
+
@h2c_upgrade: Symbol?
|
43
55
|
@closed_since: Float?
|
44
56
|
@received_frame: bool
|
45
57
|
|
@@ -54,18 +66,18 @@ module HTTP2
|
|
54
66
|
|
55
67
|
def window_update: (Integer increment) -> void
|
56
68
|
|
57
|
-
def settings: (settings_enum) -> void
|
69
|
+
def settings: (settings_enum payload) -> void
|
58
70
|
|
59
71
|
def receive: (string data) -> void
|
60
72
|
alias << receive
|
61
73
|
|
62
|
-
def initialize: (?
|
74
|
+
def initialize: (?connection_opts) -> void
|
63
75
|
|
64
76
|
private
|
65
77
|
|
66
|
-
def send: (frame) -> void
|
78
|
+
def send: (frame frame) -> void
|
67
79
|
|
68
|
-
def encode: (frame) ->
|
80
|
+
def encode: (frame frame) -> void
|
69
81
|
|
70
82
|
def connection_frame?: (frame) -> bool
|
71
83
|
|
@@ -73,13 +85,13 @@ module HTTP2
|
|
73
85
|
|
74
86
|
def ping_management: (frame) -> void
|
75
87
|
|
76
|
-
def validate_settings: (
|
88
|
+
def validate_settings: (role_type, settings_enum) -> void
|
77
89
|
|
78
90
|
def connection_settings: (frame) -> void
|
79
91
|
|
80
92
|
def decode_headers: (frame) -> void
|
81
93
|
|
82
|
-
def encode_headers: (frame) ->
|
94
|
+
def encode_headers: (frame headers_frame) -> void
|
83
95
|
|
84
96
|
def activate_stream: (id: Integer, **untyped) -> Stream
|
85
97
|
|
data/sig/emitter.rbs
CHANGED
@@ -1,13 +1,11 @@
|
|
1
1
|
module HTTP2
|
2
2
|
module Emitter
|
3
|
+
@listeners: Hash[Symbol, Array[^(*untyped) -> void]]
|
4
|
+
|
3
5
|
def on: (Symbol event) { (*untyped) -> void } -> void
|
4
6
|
|
5
7
|
def once: (Symbol event) { (*untyped) -> void } -> void
|
6
8
|
|
7
9
|
def emit: (Symbol event, *untyped args) ?{ (*untyped) -> void } -> void
|
8
|
-
|
9
|
-
private
|
10
|
-
|
11
|
-
def listeners: (Symbol event) -> Array[Proc]
|
12
10
|
end
|
13
11
|
end
|
data/sig/extensions.rbs
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
module HTTP2
|
2
2
|
module BufferUtils
|
3
|
+
def append_str: (String str, String data) -> void
|
4
|
+
|
3
5
|
def read_str: (String str, Integer n) -> String
|
4
6
|
|
5
7
|
def read_uint32: (String str) -> Integer
|
@@ -8,6 +10,6 @@ module HTTP2
|
|
8
10
|
end
|
9
11
|
|
10
12
|
module PackingExtensions
|
11
|
-
def pack: (Array[Integer] array_to_pack, String template, buffer: String, ?offset: Integer) -> String
|
13
|
+
def pack: (Array[Integer | String] array_to_pack, String template, buffer: String, ?offset: Integer) -> String
|
12
14
|
end
|
13
15
|
end
|
data/sig/flow_buffer.rbs
CHANGED
@@ -2,20 +2,22 @@ module HTTP2
|
|
2
2
|
module FlowBuffer
|
3
3
|
MAX_WINDOW_SIZE: Integer
|
4
4
|
|
5
|
+
attr_reader send_buffer: FrameBuffer
|
6
|
+
|
5
7
|
def buffered_amount: () -> Integer
|
6
8
|
|
7
9
|
def flush: () -> void
|
8
10
|
|
9
11
|
private
|
10
12
|
|
11
|
-
def
|
12
|
-
|
13
|
-
def update_local_window: (frame) -> void
|
13
|
+
def update_local_window: (data_frame frame) -> void
|
14
14
|
|
15
15
|
def calculate_window_update: (Integer) -> void
|
16
16
|
|
17
|
-
def send_data: (?
|
17
|
+
def send_data: (?data_frame? frame, ?bool encode) -> void
|
18
|
+
|
19
|
+
def send_frame: (data_frame frame, bool encode) -> void
|
18
20
|
|
19
|
-
def process_window_update: (frame:
|
21
|
+
def process_window_update: (frame: window_update_frame, ?encode: bool) -> void
|
20
22
|
end
|
21
23
|
end
|
data/sig/frame_buffer.rbs
CHANGED
data/sig/framer.rbs
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
module HTTP2
|
2
2
|
class Framer
|
3
|
+
include Error
|
3
4
|
include PackingExtensions
|
4
5
|
include BufferUtils
|
5
6
|
|
@@ -11,6 +12,8 @@ module HTTP2
|
|
11
12
|
|
12
13
|
FRAME_TYPES: Hash[Symbol, Integer]
|
13
14
|
|
15
|
+
FRAME_TYPES_BY_NAME: Array[Symbol]
|
16
|
+
|
14
17
|
FRAME_TYPES_WITH_PADDING: Array[Symbol]
|
15
18
|
|
16
19
|
FRAME_FLAGS: Hash[Symbol, Hash[Symbol, Integer]]
|
@@ -38,6 +41,8 @@ module HTTP2
|
|
38
41
|
|
39
42
|
def common_header: (frame, buffer: String) -> String
|
40
43
|
|
44
|
+
def read_common_header: (String buf) -> frame
|
45
|
+
|
41
46
|
def read_common_frame: (String) -> frame
|
42
47
|
|
43
48
|
def generate: (frame) -> String
|
data/sig/header/compressor.rbs
CHANGED
@@ -9,7 +9,7 @@ module HTTP2
|
|
9
9
|
|
10
10
|
def integer: (Integer, Integer, buffer: String, ?offset: Integer) -> String
|
11
11
|
|
12
|
-
def string: (String) -> String
|
12
|
+
def string: (String, ?String buffer) -> String
|
13
13
|
|
14
14
|
def header: (header_command, ?String) -> String
|
15
15
|
|
@@ -17,11 +17,13 @@ module HTTP2
|
|
17
17
|
|
18
18
|
private
|
19
19
|
|
20
|
-
def initialize: (?
|
20
|
+
def initialize: (?connection_opts options) -> void
|
21
21
|
|
22
|
-
def huffman_string: (String str) -> String
|
22
|
+
def huffman_string: (String str, ?String buffer) -> String
|
23
23
|
|
24
|
-
def plain_string: (String str) -> String
|
24
|
+
def plain_string: (String str, ?String buffer) -> String
|
25
|
+
|
26
|
+
def set_huffman_size: (String str, Integer huffman_offset) -> String
|
25
27
|
end
|
26
28
|
end
|
27
29
|
end
|
data/sig/header/decompressor.rbs
CHANGED
@@ -3,6 +3,8 @@ module HTTP2
|
|
3
3
|
class Decompressor
|
4
4
|
include BufferUtils
|
5
5
|
|
6
|
+
FORBIDDEN_HEADERS: Array[String]
|
7
|
+
|
6
8
|
@cc: EncodingContext
|
7
9
|
|
8
10
|
def table_size=: (Integer) -> void
|
@@ -17,8 +19,7 @@ module HTTP2
|
|
17
19
|
| (String) -> Array[header_pair]
|
18
20
|
private
|
19
21
|
|
20
|
-
def initialize: (
|
21
|
-
| () -> untyped
|
22
|
+
def initialize: (?connection_opts options) -> void
|
22
23
|
end
|
23
24
|
end
|
24
25
|
end
|
@@ -3,32 +3,50 @@ module HTTP2
|
|
3
3
|
class EncodingContext
|
4
4
|
STATIC_TABLE: Array[header_pair]
|
5
5
|
|
6
|
+
STATIC_TABLE_BY_FIELD: Hash[String, Array[[Integer, String]]]
|
7
|
+
|
8
|
+
STATIC_TABLE_SIZE: Integer
|
9
|
+
|
10
|
+
STATIC_ALL: Array[Symbol]
|
11
|
+
|
12
|
+
STATIC_NEVER: Array[Symbol]
|
13
|
+
|
14
|
+
DEFAULT_OPTIONS: context_hash
|
15
|
+
|
16
|
+
UPPER: Regexp
|
17
|
+
|
18
|
+
|
6
19
|
attr_reader table: Array[header_pair]
|
7
20
|
|
8
21
|
attr_reader options: context_hash
|
9
22
|
|
23
|
+
attr_reader current_table_size: Integer
|
24
|
+
|
25
|
+
@limit: Integer
|
26
|
+
|
27
|
+
@_table_updated: bool
|
28
|
+
|
10
29
|
def dup: () -> EncodingContext
|
11
30
|
|
12
31
|
def dereference: (Integer) -> header_pair
|
13
32
|
|
14
33
|
def process: (header_command cmd) -> header_pair?
|
15
34
|
|
16
|
-
def encode: (_Each[header_pair]) ->
|
35
|
+
def encode: (_Each[header_pair]) { (header_command) -> void } -> void
|
17
36
|
|
18
37
|
def addcmd: (String name, String value) -> header_command
|
19
38
|
|
20
39
|
def table_size=: (Integer) -> void
|
21
40
|
|
22
|
-
def
|
41
|
+
def listen_on_table: { () -> void } -> void
|
23
42
|
|
24
43
|
private
|
25
44
|
|
26
|
-
def initialize: (
|
27
|
-
| () -> untyped
|
45
|
+
def initialize: (?connection_opts options) -> void
|
28
46
|
|
29
|
-
def add_to_table: (
|
47
|
+
def add_to_table: (string name, string value) -> void
|
30
48
|
|
31
|
-
def size_check: (
|
49
|
+
def size_check: (Integer cmdsize) -> bool
|
32
50
|
end
|
33
51
|
end
|
34
52
|
end
|
data/sig/header/huffman.rbs
CHANGED
@@ -1,9 +1,25 @@
|
|
1
1
|
module HTTP2
|
2
2
|
module Header
|
3
|
-
|
4
|
-
|
3
|
+
module Huffman
|
4
|
+
include Error
|
5
|
+
extend PackingExtensions
|
6
|
+
extend BufferUtils
|
5
7
|
|
6
|
-
|
8
|
+
BITS_AT_ONCE: Integer
|
9
|
+
|
10
|
+
EOS: Integer
|
11
|
+
|
12
|
+
CODES: Array[[Integer, Integer]]
|
13
|
+
|
14
|
+
ENCODE_TABLE: Array[String]
|
15
|
+
|
16
|
+
MAX_FINAL_STATE: Integer
|
17
|
+
|
18
|
+
MACHINE: Array[Array[[Integer?, Integer]]]
|
19
|
+
|
20
|
+
def self?.encode: (String str, ?String buffer) -> String
|
21
|
+
|
22
|
+
def self?.decode: (String str) -> String
|
7
23
|
end
|
8
24
|
end
|
9
25
|
end
|
data/sig/header.rbs
CHANGED
@@ -3,16 +3,19 @@ module HTTP2
|
|
3
3
|
type header_key = :type | :name | :value | :index
|
4
4
|
type header_value = Integer | String | :indexed | :changetablesize | :incremental | :noindex | :neverindexed
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
type context_hash = Hash[Symbol, Symbol | Integer]
|
6
|
+
type context_hash = {
|
7
|
+
huffman: (:always | :never | :shorter),
|
8
|
+
index: (:all | :static | :never),
|
9
|
+
table_size: Integer
|
10
|
+
}
|
12
11
|
|
13
|
-
type
|
12
|
+
type header_type = :indexed | :incremental | :noindex | :neverindexed | :changetablesize
|
14
13
|
|
15
|
-
|
14
|
+
type header_command = { type: :indexed , name: Integer } |
|
15
|
+
{ type: (:incremental | :noindex | :neverindexed), name: Integer | String, value: String } |
|
16
|
+
{ type: :changetablesize, ?name: Integer, value: Integer }
|
17
|
+
|
18
|
+
HEADREP: Hash[header_type, { prefix: Integer, pattern: Integer }]
|
16
19
|
|
17
20
|
NAIVE: Hash[Symbol, Symbol]
|
18
21
|
LINEAR: Hash[Symbol, Symbol]
|