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.
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 == :open ||
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
- # @remote_window is maintained in send_data
200
- send_data(frame)
202
+ # stream state management is maintained in send_data
203
+ return send_data(frame)
201
204
  when :window_update
202
- manage_state(frame) do
203
- @local_window += frame[:increment]
204
- emit(:frame, frame)
205
- end
206
- else
207
- manage_state(frame) do
208
- emit(:frame, frame)
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 then process_priority(frame)
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
- @state = if sending
404
- case frame[:type]
405
- when :headers then event(:half_closed_remote)
406
- when :rst_stream then event(:local_rst)
407
- else stream_error
408
- end
409
- else
410
- case frame[:type]
411
- when :rst_stream then event(:remote_rst)
412
- when :priority, :window_update then @state
413
- else stream_error
414
- end
415
- end
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
- @state = if sending
433
- case frame[:type]
434
- when :rst_stream then event(:local_rst)
435
- when :priority, :window_update then @state
436
- else stream_error
437
- end
438
- else
439
- case frame[:type]
440
- when :headers then event(:half_closed_local)
441
- when :rst_stream then event(:remote_rst)
442
- else stream_error
443
- end
444
- end
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 # ignore
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module HTTP2
4
- VERSION = "1.0.2"
4
+ VERSION = "1.1.1"
5
5
  end
data/lib/http/2.rb CHANGED
@@ -1,6 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "http/2/version"
4
+
5
+ module HTTP2
6
+ EMPTY = [].freeze
7
+ end
8
+
4
9
  require "http/2/extensions"
5
10
  require "http/2/base64"
6
11
  require "http/2/error"
@@ -7,7 +7,18 @@ module HTTP2
7
7
 
8
8
  DEFAULT_MAX_CONCURRENT_STREAMS: Integer
9
9
 
10
- type settings_hash = Hash[Symbol, Integer]
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
- # type headers_frame = {
35
- # type: :headers, flags: frame_control_flags, stream: Integer, payload: Enumerable[header_pair],
36
- # ?method: Symbol, ?trailer: Array[String], ?content_length: Integer, ?padding: Integer
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, stream: Integer, length: Integer, payload: String, padding: Integer }
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
- # type push_promise_frame = { type: :push_promise, promise_stream: Integer, flags: frame_control_flags, stream: Integer, ?method: Symbol, ?trailer: Array[String], ?content_length: Integer, payload: Enumerable[header_pair], ?padding: Integer }
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
- # type settings_frame = { type: :settings, stream: 0, payload: Array[[Symbol | Integer, Integer]] }
59
+ type settings_frame = { type: :settings, payload: Array[[Symbol | Integer, Integer]] }
49
60
 
50
61
  # # WINDOW_UPDATE
51
- # type window_update_frame = { type: :window_update, stream: Integer, increment: Integer }
62
+ type window_update_frame = { type: :window_update, increment: Integer }
52
63
 
53
64
  # # PRIORITY
54
- type priority_frame = { type: :priority, stream: Integer, dependency: Integer, exclusive: bool, weight: Integer }
65
+ type priority_frame = { dependency: Integer, exclusive: bool, weight: Integer }
55
66
 
56
67
  # # ALTSVC
57
- # type altsvc_frame = { type: :altsvc, stream: 0, max_age: Integer, port: Integer, proto: "String", host: String }
68
+ type altsvc_frame = { type: :altsvc, max_age: Integer, port: Integer, proto: "String", host: String }
58
69
 
59
70
  # # ORIGIN
60
- # type origin_frame = { type: :origin, stream: 0, origin: Array[String] }
71
+ type origin_frame = { type: :origin, origin: Array[String] }
61
72
 
62
73
  # # PING
63
- # type ping_frame = { type: :ping, payload: String, length: Integer }
74
+ type ping_frame = { type: :ping, payload: String, length: Integer }
64
75
 
65
76
  # # GOAWAY
66
- # type goaway_frame = { type: :goaway, stream: 0, last_stream: Integer, error: Symbol? }
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
@@ -1,5 +1,7 @@
1
1
  module HTTP2
2
2
  class Client < Connection
3
+ @h2c_upgrade: Symbol?
4
+
3
5
  def upgrade: () -> Stream
4
6
 
5
7
  def send_connection_preface: () -> void
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, Stream]
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: (?settings_hash) -> void
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) -> Array[String]
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: (:client | :server, settings_enum) -> void
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) -> Array[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 send_buffer: () -> FrameBuffer
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: (?frame? frame, ?bool encode) -> void
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: frame, ?encode: bool) -> void
21
+ def process_window_update: (frame: window_update_frame, ?encode: bool) -> void
20
22
  end
21
23
  end
data/sig/frame_buffer.rbs CHANGED
@@ -4,7 +4,7 @@ module HTTP2
4
4
 
5
5
  @buffer: Array[data_frame]
6
6
 
7
- def <<: (data_frame) -> void
7
+ def <<: (data_frame frame) -> void
8
8
 
9
9
  def empty?: () -> bool
10
10
 
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
@@ -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: (?context_hash options) -> void
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
@@ -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: (context_hash options) -> untyped
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]) -> Array[header_command]
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 current_table_size: () -> Integer
41
+ def listen_on_table: { () -> void } -> void
23
42
 
24
43
  private
25
44
 
26
- def initialize: (context_hash options) -> untyped
27
- | () -> untyped
45
+ def initialize: (?connection_opts options) -> void
28
46
 
29
- def add_to_table: (header_pair) -> void
47
+ def add_to_table: (string name, string value) -> void
30
48
 
31
- def size_check: (header_pair?) -> bool
49
+ def size_check: (Integer cmdsize) -> bool
32
50
  end
33
51
  end
34
52
  end
@@ -1,9 +1,25 @@
1
1
  module HTTP2
2
2
  module Header
3
- class Huffman
4
- def encode: (String str) -> String
3
+ module Huffman
4
+ include Error
5
+ extend PackingExtensions
6
+ extend BufferUtils
5
7
 
6
- def decode: (String str) -> String
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
- #type context_hash = {
7
- # huffman?: (:always | :never | :shorter),
8
- # index?: (:all | :static | :never),
9
- # table_size?: Integer
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 header_command = Hash[header_key, header_value]
12
+ type header_type = :indexed | :incremental | :noindex | :neverindexed | :changetablesize
14
13
 
15
- HEADREP: Hash[Symbol, Hash[Symbol, Integer]]
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]