http-2-next 0.4.3 → 0.5.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/README.md +3 -3
- data/lib/http/2/next/client.rb +2 -2
- data/lib/http/2/next/connection.rb +27 -24
- data/lib/http/2/next/emitter.rb +1 -1
- data/lib/http/2/next/error.rb +9 -2
- data/lib/http/2/next/flow_buffer.rb +3 -5
- data/lib/http/2/next/framer.rb +8 -12
- data/lib/http/2/next/header/compressor.rb +1 -1
- data/lib/http/2/next/header/decompressor.rb +2 -2
- data/lib/http/2/next/header/encoding_context.rb +17 -8
- data/lib/http/2/next/header/huffman.rb +2 -2
- data/lib/http/2/next/server.rb +2 -2
- data/lib/http/2/next/stream.rb +4 -5
- data/lib/http/2/next/version.rb +1 -1
- data/sig/connection.rbs +14 -15
- data/sig/error.rbs +2 -0
- data/sig/flow_buffer.rbs +1 -3
- data/sig/frame_buffer.rbs +3 -3
- data/sig/framer.rbs +32 -5
- data/sig/header.rbs +12 -0
- data/sig/next.rbs +13 -7
- data/sig/stream.rbs +4 -4
- metadata +11 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a7c15b998344b09aee75566b64f5ef94abb9b388fdc3d2f06704e8263a586789
|
4
|
+
data.tar.gz: 935a6225e964eb46b6f26e57ccf3080fd231570f3710bf6e78e3f05f589a294f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5d768219d315950da7cc798981c6d081e23f2ffab97f354149ebae1398a25cf3db304bdd81429f8e3f257cb0100cc1a28374a1459cef4dc551d317d9bb1cade0
|
7
|
+
data.tar.gz: 758a733387749553121d3117d9a86ae6109fc28fcbae12cce2852c9d291a30ad133c16060a5374c6c13aadc16af02996fba41a239998d32a194d0516fa75c71f
|
data/README.md
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# HTTP-2-Next
|
2
2
|
|
3
3
|
[](http://rubygems.org/gems/http-2-next)
|
4
|
-
[](https://gitlab.com/os85/http-2-next/commits/master)
|
5
|
+
[](https://os85.gitlab.io/http-2-next/coverage/#_AllFiles)
|
6
6
|
|
7
7
|
**Attention!** This is a fork of the [http-2](https://github.com/igrigorik/http-2) gem.
|
8
8
|
|
@@ -265,7 +265,7 @@ conn.on(:stream) do |stream|
|
|
265
265
|
# split response between multiple DATA frames
|
266
266
|
stream.data(response_chunk, end_stream: false)
|
267
267
|
stream.data(last_chunk)
|
268
|
-
|
268
|
+
|
269
269
|
# now send the previously promised data
|
270
270
|
push_stream.data(push_data)
|
271
271
|
end
|
data/lib/http/2/next/client.rb
CHANGED
@@ -74,8 +74,8 @@ module HTTP2Next
|
|
74
74
|
|
75
75
|
private
|
76
76
|
|
77
|
-
def verify_pseudo_headers(frame
|
78
|
-
|
77
|
+
def verify_pseudo_headers(frame)
|
78
|
+
_verify_pseudo_headers(frame, RESPONSE_MANDATORY_HEADERS)
|
79
79
|
end
|
80
80
|
end
|
81
81
|
end
|
@@ -17,7 +17,7 @@ module HTTP2Next
|
|
17
17
|
settings_max_concurrent_streams: Framer::MAX_STREAM_ID, # unlimited
|
18
18
|
settings_initial_window_size: 65_535,
|
19
19
|
settings_max_frame_size: 16_384,
|
20
|
-
settings_max_header_list_size: 2
|
20
|
+
settings_max_header_list_size: (2 << 30) - 1 # unlimited
|
21
21
|
}.freeze
|
22
22
|
|
23
23
|
DEFAULT_CONNECTION_SETTINGS = {
|
@@ -26,7 +26,7 @@ module HTTP2Next
|
|
26
26
|
settings_max_concurrent_streams: 100,
|
27
27
|
settings_initial_window_size: 65_535,
|
28
28
|
settings_max_frame_size: 16_384,
|
29
|
-
settings_max_header_list_size: 2
|
29
|
+
settings_max_header_list_size: (2 << 30) - 1 # unlimited
|
30
30
|
}.freeze
|
31
31
|
|
32
32
|
# Default stream priority (lower values are higher priority).
|
@@ -120,6 +120,7 @@ module HTTP2Next
|
|
120
120
|
# @param parent [Stream]
|
121
121
|
def new_stream(**args)
|
122
122
|
raise ConnectionClosed if @state == :closed
|
123
|
+
|
123
124
|
raise StreamLimitExceeded if @active_stream_count >= (@max_streams || @remote_settings[:settings_max_concurrent_streams])
|
124
125
|
|
125
126
|
connection_error(:protocol_error, msg: "id is smaller than previous") if @stream_id < @last_activated_stream
|
@@ -344,7 +345,7 @@ module HTTP2Next
|
|
344
345
|
end
|
345
346
|
end
|
346
347
|
|
347
|
-
|
348
|
+
_verify_pseudo_headers(frame, REQUEST_MANDATORY_HEADERS)
|
348
349
|
stream = activate_stream(id: pid, parent: parent)
|
349
350
|
verify_stream_order(stream.id)
|
350
351
|
emit(:promise, stream)
|
@@ -380,7 +381,7 @@ module HTTP2Next
|
|
380
381
|
# (see Section 5.1).
|
381
382
|
when :window_update
|
382
383
|
stream = @streams_recently_closed[frame[:stream]]
|
383
|
-
connection_error(:protocol_error, "sent window update on idle stream") unless stream
|
384
|
+
connection_error(:protocol_error, msg: "sent window update on idle stream") unless stream
|
384
385
|
process_window_update(frame: frame, encode: true)
|
385
386
|
else
|
386
387
|
# An endpoint that receives an unexpected stream identifier
|
@@ -397,8 +398,8 @@ module HTTP2Next
|
|
397
398
|
connection_error(e: e)
|
398
399
|
end
|
399
400
|
|
400
|
-
def <<(
|
401
|
-
receive(
|
401
|
+
def <<(data)
|
402
|
+
receive(data)
|
402
403
|
end
|
403
404
|
|
404
405
|
private
|
@@ -692,26 +693,28 @@ module HTTP2Next
|
|
692
693
|
|
693
694
|
frames = []
|
694
695
|
|
695
|
-
|
696
|
-
|
697
|
-
|
698
|
-
|
699
|
-
|
700
|
-
|
701
|
-
|
702
|
-
|
703
|
-
|
704
|
-
|
705
|
-
|
706
|
-
|
707
|
-
|
708
|
-
|
696
|
+
begin
|
697
|
+
while payload && payload.bytesize > 0
|
698
|
+
cont = frame.dup
|
699
|
+
cont[:type] = :continuation
|
700
|
+
cont[:flags] = []
|
701
|
+
cont[:payload] = payload.byteslice(0, @remote_settings[:settings_max_frame_size])
|
702
|
+
payload = payload.byteslice(@remote_settings[:settings_max_frame_size]..-1)
|
703
|
+
frames << cont
|
704
|
+
end
|
705
|
+
|
706
|
+
if frames.empty?
|
707
|
+
frames << frame
|
708
|
+
else
|
709
|
+
frames.first[:type] = frame[:type]
|
710
|
+
frames.first[:flags] = frame[:flags] - [:end_headers]
|
711
|
+
frames.last[:flags] << :end_headers
|
712
|
+
end
|
713
|
+
rescue StandardError => e
|
714
|
+
connection_error(:compression_error, e: e)
|
709
715
|
end
|
710
716
|
|
711
717
|
frames
|
712
|
-
rescue StandardError => e
|
713
|
-
connection_error(:compression_error, e: e)
|
714
|
-
nil
|
715
718
|
end
|
716
719
|
|
717
720
|
# Activates new incoming or outgoing stream and registers appropriate
|
@@ -758,7 +761,7 @@ module HTTP2Next
|
|
758
761
|
@last_stream_id = id
|
759
762
|
end
|
760
763
|
|
761
|
-
def
|
764
|
+
def _verify_pseudo_headers(frame, mandatory_headers)
|
762
765
|
headers = frame[:payload]
|
763
766
|
return if headers.is_a?(String)
|
764
767
|
|
data/lib/http/2/next/emitter.rb
CHANGED
@@ -10,7 +10,7 @@ module HTTP2Next
|
|
10
10
|
# @param event [Symbol]
|
11
11
|
# @param block [Proc] callback function
|
12
12
|
def on(event, &block)
|
13
|
-
raise ArgumentError, "must provide callback" unless
|
13
|
+
raise ArgumentError, "must provide callback" unless block
|
14
14
|
|
15
15
|
listeners(event.to_sym).push block
|
16
16
|
end
|
data/lib/http/2/next/error.rb
CHANGED
@@ -3,7 +3,8 @@
|
|
3
3
|
module HTTP2Next
|
4
4
|
# Stream, connection, and compressor exceptions.
|
5
5
|
module Error
|
6
|
-
@types = {}
|
6
|
+
@types = {} # rubocop:disable ThreadSafety/MutableClassInstanceVariable
|
7
|
+
|
7
8
|
class << self
|
8
9
|
attr_reader :types
|
9
10
|
end
|
@@ -11,7 +12,11 @@ module HTTP2Next
|
|
11
12
|
class Error < StandardError
|
12
13
|
def self.inherited(klass)
|
13
14
|
super
|
14
|
-
|
15
|
+
|
16
|
+
type = klass.name or return
|
17
|
+
|
18
|
+
type = type.split("::").last or return
|
19
|
+
|
15
20
|
type = type.gsub(/([^\^])([A-Z])/, '\1_\2').downcase.to_sym
|
16
21
|
HTTP2Next::Error.types[type] = klass
|
17
22
|
end
|
@@ -56,5 +61,7 @@ module HTTP2Next
|
|
56
61
|
class StreamLimitExceeded < Error; end
|
57
62
|
|
58
63
|
class FrameSizeError < Error; end
|
64
|
+
|
65
|
+
@types.freeze
|
59
66
|
end
|
60
67
|
end
|
@@ -7,7 +7,7 @@ module HTTP2Next
|
|
7
7
|
module FlowBuffer
|
8
8
|
include Error
|
9
9
|
|
10
|
-
MAX_WINDOW_SIZE = 2
|
10
|
+
MAX_WINDOW_SIZE = (2 << 30) - 1
|
11
11
|
|
12
12
|
# Amount of buffered data. Only DATA payloads are subject to flow stream
|
13
13
|
# and connection flow control.
|
@@ -118,9 +118,7 @@ module HTTP2Next
|
|
118
118
|
end
|
119
119
|
|
120
120
|
def retrieve(window_size)
|
121
|
-
|
122
|
-
|
123
|
-
frame = @buffer.first
|
121
|
+
frame = @buffer.first or return
|
124
122
|
|
125
123
|
frame_size = frame[:payload].bytesize
|
126
124
|
end_stream = frame[:flags].include? :end_stream
|
@@ -133,7 +131,7 @@ module HTTP2Next
|
|
133
131
|
@buffer.shift
|
134
132
|
|
135
133
|
if frame_size > window_size
|
136
|
-
payload = frame
|
134
|
+
payload = frame[:payload]
|
137
135
|
chunk = frame.dup
|
138
136
|
|
139
137
|
# Split frame so that it fits in the window
|
data/lib/http/2/next/framer.rb
CHANGED
@@ -9,7 +9,7 @@ module HTTP2Next
|
|
9
9
|
include Error
|
10
10
|
|
11
11
|
# Default value of max frame size (16384 bytes)
|
12
|
-
DEFAULT_MAX_FRAME_SIZE = 2
|
12
|
+
DEFAULT_MAX_FRAME_SIZE = 2 << 13
|
13
13
|
|
14
14
|
# maximum frame size
|
15
15
|
attr_accessor :local_max_frame_size, :remote_max_frame_size
|
@@ -325,7 +325,7 @@ module HTTP2Next
|
|
325
325
|
# Padding: Padding octets that contain no application semantic value.
|
326
326
|
# Padding octets MUST be set to zero when sending and ignored when
|
327
327
|
# receiving.
|
328
|
-
bytes << "\0" * padlen
|
328
|
+
bytes << ("\0" * padlen)
|
329
329
|
end
|
330
330
|
|
331
331
|
frame[:length] = length
|
@@ -368,7 +368,7 @@ module HTTP2Next
|
|
368
368
|
end
|
369
369
|
|
370
370
|
case frame[:type]
|
371
|
-
when :data
|
371
|
+
when :data, :ping, :continuation
|
372
372
|
frame[:payload] = payload.read(frame[:length])
|
373
373
|
when :headers
|
374
374
|
if frame[:flags].include? :priority
|
@@ -414,8 +414,6 @@ module HTTP2Next
|
|
414
414
|
when :push_promise
|
415
415
|
frame[:promise_stream] = payload.read_uint32 & RBIT
|
416
416
|
frame[:payload] = payload.read(frame[:length])
|
417
|
-
when :ping
|
418
|
-
frame[:payload] = payload.read(frame[:length])
|
419
417
|
when :goaway
|
420
418
|
frame[:last_stream] = payload.read_uint32 & RBIT
|
421
419
|
frame[:error] = unpack_error payload.read_uint32
|
@@ -428,8 +426,6 @@ module HTTP2Next
|
|
428
426
|
end
|
429
427
|
|
430
428
|
frame[:increment] = payload.read_uint32 & RBIT
|
431
|
-
when :continuation
|
432
|
-
frame[:payload] = payload.read(frame[:length])
|
433
429
|
when :altsvc
|
434
430
|
frame[:max_age], frame[:port] = payload.read(6).unpack(UINT32 + UINT16)
|
435
431
|
|
@@ -460,14 +456,14 @@ module HTTP2Next
|
|
460
456
|
|
461
457
|
private
|
462
458
|
|
463
|
-
def pack_error(
|
464
|
-
unless
|
465
|
-
|
459
|
+
def pack_error(error)
|
460
|
+
unless error.is_a? Integer
|
461
|
+
error = DEFINED_ERRORS[error]
|
466
462
|
|
467
|
-
raise CompressionError, "Unknown error ID for #{
|
463
|
+
raise CompressionError, "Unknown error ID for #{error}" unless error
|
468
464
|
end
|
469
465
|
|
470
|
-
[
|
466
|
+
[error].pack(UINT32)
|
471
467
|
end
|
472
468
|
|
473
469
|
def unpack_error(error)
|
@@ -30,8 +30,8 @@ module HTTP2Next
|
|
30
30
|
# @param n [Integer] number of available bits
|
31
31
|
# @return [Integer]
|
32
32
|
def integer(buf, n)
|
33
|
-
limit = 2**n - 1
|
34
|
-
i =
|
33
|
+
limit = (2**n) - 1
|
34
|
+
i = n.zero? ? 0 : (buf.shift_byte & limit)
|
35
35
|
|
36
36
|
m = 0
|
37
37
|
if i == limit
|
@@ -79,6 +79,13 @@ module HTTP2Next
|
|
79
79
|
["www-authenticate", ""]
|
80
80
|
].each { |pair| pair.each(&:freeze).freeze }.freeze
|
81
81
|
|
82
|
+
STATIC_TABLE_BY_FIELD = STATIC_TABLE
|
83
|
+
.each_with_object({})
|
84
|
+
.with_index { |((field, value), hs), idx| (hs[field] ||= []) << [idx, value] }
|
85
|
+
.each { |pair| pair.each(&:freeze).freeze }.freeze
|
86
|
+
|
87
|
+
STATIC_TABLE_SIZE = STATIC_TABLE.size
|
88
|
+
|
82
89
|
# Current table of header key-value pairs.
|
83
90
|
attr_reader :table
|
84
91
|
|
@@ -133,7 +140,7 @@ module HTTP2Next
|
|
133
140
|
# @return [Array] +[key, value]+
|
134
141
|
def dereference(index)
|
135
142
|
# NOTE: index is zero-based in this module.
|
136
|
-
value = STATIC_TABLE[index] || @table[index -
|
143
|
+
value = STATIC_TABLE[index] || @table[index - STATIC_TABLE_SIZE]
|
137
144
|
raise CompressionError, "Index too large" unless value
|
138
145
|
|
139
146
|
value
|
@@ -245,22 +252,24 @@ module HTTP2Next
|
|
245
252
|
name_only = nil
|
246
253
|
|
247
254
|
if %i[all static].include?(@options[:index])
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
break
|
252
|
-
elsif STATIC_TABLE[i].first == header.first
|
255
|
+
field, value = header
|
256
|
+
if (svalues = STATIC_TABLE_BY_FIELD[field])
|
257
|
+
svalues.each do |i, svalue|
|
253
258
|
name_only ||= i
|
259
|
+
if svalue == value
|
260
|
+
exact = i
|
261
|
+
break
|
262
|
+
end
|
254
263
|
end
|
255
264
|
end
|
256
265
|
end
|
257
266
|
if [:all].include?(@options[:index]) && !exact
|
258
267
|
@table.each_index do |i|
|
259
268
|
if @table[i] == header
|
260
|
-
exact ||= i +
|
269
|
+
exact ||= i + STATIC_TABLE_SIZE
|
261
270
|
break
|
262
271
|
elsif @table[i].first == header.first
|
263
|
-
name_only ||= i +
|
272
|
+
name_only ||= i + STATIC_TABLE_SIZE
|
264
273
|
end
|
265
274
|
end
|
266
275
|
end
|
@@ -25,7 +25,7 @@ module HTTP2Next
|
|
25
25
|
# @return [String] binary string
|
26
26
|
def encode(str)
|
27
27
|
bitstring = str.each_byte.map { |chr| ENCODE_TABLE[chr] }.join
|
28
|
-
bitstring << "1" * ((8 - bitstring.size) % 8)
|
28
|
+
bitstring << ("1" * ((8 - bitstring.size) % 8))
|
29
29
|
[bitstring].pack("B*")
|
30
30
|
end
|
31
31
|
|
@@ -40,7 +40,7 @@ module HTTP2Next
|
|
40
40
|
|
41
41
|
mask = (1 << BITS_AT_ONCE) - 1
|
42
42
|
buf.each_byte do |chr|
|
43
|
-
(8 / BITS_AT_ONCE - 1).downto(0) do |shift|
|
43
|
+
((8 / BITS_AT_ONCE) - 1).downto(0) do |shift|
|
44
44
|
branch = (chr >> (shift * BITS_AT_ONCE)) & mask
|
45
45
|
# MACHINE[state] = [final, [transitions]]
|
46
46
|
# [final] unfinished bits so far are prefix of the EOS code.
|
data/lib/http/2/next/server.rb
CHANGED
@@ -133,8 +133,8 @@ module HTTP2Next
|
|
133
133
|
send(type: :origin, stream: 0, payload: @origin_set)
|
134
134
|
end
|
135
135
|
|
136
|
-
def verify_pseudo_headers(frame
|
137
|
-
|
136
|
+
def verify_pseudo_headers(frame)
|
137
|
+
_verify_pseudo_headers(frame, REQUEST_MANDATORY_HEADERS)
|
138
138
|
end
|
139
139
|
|
140
140
|
# Handle locally initiated server-push event emitted by the stream.
|
data/lib/http/2/next/stream.rb
CHANGED
@@ -129,10 +129,9 @@ module HTTP2Next
|
|
129
129
|
@_status_code ||= frame[:status]
|
130
130
|
@_content_length ||= frame[:content_length]
|
131
131
|
@_trailers ||= frame[:trailer]
|
132
|
-
if @_waiting_on_trailers
|
133
|
-
|
134
|
-
|
135
|
-
(!@_status_code || @_status_code >= 200)
|
132
|
+
if @_waiting_on_trailers ||
|
133
|
+
(@received_data &&
|
134
|
+
(!@_status_code || @_status_code >= 200))
|
136
135
|
|
137
136
|
# An endpoint that receives a HEADERS frame without the END_STREAM flag set after receiving a final
|
138
137
|
# (non-informational) status code MUST treat the corresponding request or response as malformed.
|
@@ -225,7 +224,7 @@ module HTTP2Next
|
|
225
224
|
end
|
226
225
|
|
227
226
|
def promise(headers, end_headers: true, &block)
|
228
|
-
raise ArgumentError, "must provide callback" unless
|
227
|
+
raise ArgumentError, "must provide callback" unless block
|
229
228
|
|
230
229
|
flags = end_headers ? [:end_headers] : []
|
231
230
|
emit(:promise, self, headers, flags, &block)
|
data/lib/http/2/next/version.rb
CHANGED
data/sig/connection.rbs
CHANGED
@@ -3,6 +3,9 @@ module HTTP2Next
|
|
3
3
|
include FlowBuffer
|
4
4
|
include Emitter
|
5
5
|
|
6
|
+
REQUEST_MANDATORY_HEADERS: Array[String]
|
7
|
+
RESPONSE_MANDATORY_HEADERS: Array[String]
|
8
|
+
|
6
9
|
attr_reader state: Symbol
|
7
10
|
|
8
11
|
attr_reader local_window: Integer
|
@@ -12,28 +15,20 @@ module HTTP2Next
|
|
12
15
|
|
13
16
|
attr_reader remote_settings: settings_hash
|
14
17
|
attr_reader local_settings: settings_hash
|
15
|
-
attr_reader pending_settings:
|
18
|
+
attr_reader pending_settings: settings_ary
|
16
19
|
|
17
20
|
attr_reader active_stream_count: Integer
|
18
21
|
|
19
|
-
attr_writer max_streams: Integer
|
22
|
+
attr_writer max_streams: Integer?
|
20
23
|
|
21
24
|
def closed?: () -> bool
|
22
25
|
|
23
|
-
def new_stream: (
|
24
|
-
?weight: Integer,
|
25
|
-
?dependency: Integer,
|
26
|
-
?exclusive: bool,
|
27
|
-
?parent: Stream?,
|
28
|
-
?state: Symbol
|
29
|
-
) -> Stream
|
26
|
+
def new_stream: (**untyped) -> Stream
|
30
27
|
|
31
28
|
def ping: (String) -> void
|
32
29
|
| (String) { () -> void } -> void
|
33
30
|
|
34
|
-
def goaway: (Symbol, String
|
35
|
-
| (Symbol) -> void
|
36
|
-
| () -> void
|
31
|
+
def goaway: (?Symbol, ?String) -> void
|
37
32
|
|
38
33
|
def window_update: (Integer increment) -> void
|
39
34
|
|
@@ -44,7 +39,7 @@ module HTTP2Next
|
|
44
39
|
|
45
40
|
private
|
46
41
|
|
47
|
-
def initialize: (settings_hash) -> untyped
|
42
|
+
def initialize: (?settings_hash) -> untyped
|
48
43
|
|
49
44
|
def send: (frame) -> void
|
50
45
|
|
@@ -64,10 +59,14 @@ module HTTP2Next
|
|
64
59
|
|
65
60
|
def encode_headers: (frame) -> Array[frame]
|
66
61
|
|
67
|
-
def activate_stream: (id: Integer, **untyped) ->
|
62
|
+
def activate_stream: (id: Integer, **untyped) -> Stream
|
68
63
|
|
69
64
|
def verify_stream_order: (Integer id) -> void
|
70
65
|
|
71
|
-
def verify_pseudo_headers: (frame
|
66
|
+
def verify_pseudo_headers: (frame) -> void
|
67
|
+
|
68
|
+
def _verify_pseudo_headers: (frame, Array[String]) -> void
|
69
|
+
|
70
|
+
def connection_error: (?Symbol error, ?msg: String, ?e: StandardError) -> void
|
72
71
|
end
|
73
72
|
end
|
data/sig/error.rbs
ADDED
data/sig/flow_buffer.rbs
CHANGED
@@ -14,9 +14,7 @@ module HTTP2Next
|
|
14
14
|
|
15
15
|
def calculate_window_update: (Integer) -> void
|
16
16
|
|
17
|
-
def send_data: () -> void
|
18
|
-
| (frame?) -> void
|
19
|
-
| (frame?, bool) -> void
|
17
|
+
def send_data: (?frame? frame, ?bool encode) -> void
|
20
18
|
|
21
19
|
def process_window_update: (frame: frame, ?encode: bool) -> void
|
22
20
|
end
|
data/sig/frame_buffer.rbs
CHANGED
@@ -2,12 +2,12 @@ module HTTP2Next
|
|
2
2
|
class FrameBuffer
|
3
3
|
attr_reader bytesize: Integer
|
4
4
|
|
5
|
-
@buffer: Array[
|
5
|
+
@buffer: Array[data_frame]
|
6
6
|
|
7
|
-
def <<: (
|
7
|
+
def <<: (data_frame) -> void
|
8
8
|
|
9
9
|
def empty?: () -> bool
|
10
10
|
|
11
|
-
def retrieve: (Integer) ->
|
11
|
+
def retrieve: (Integer) -> data_frame?
|
12
12
|
end
|
13
13
|
end
|
data/sig/framer.rbs
CHANGED
@@ -1,7 +1,36 @@
|
|
1
1
|
module HTTP2Next
|
2
2
|
class Framer
|
3
|
+
DEFAULT_MAX_FRAME_SIZE: Integer
|
4
|
+
|
5
|
+
MAX_STREAM_ID: Integer
|
6
|
+
|
7
|
+
MAX_WINDOWINC: Integer
|
8
|
+
|
9
|
+
FRAME_TYPES: Hash[Symbol, Integer]
|
10
|
+
|
11
|
+
FRAME_TYPES_WITH_PADDING: Array[Symbol]
|
12
|
+
|
13
|
+
FRAME_FLAGS: Hash[Symbol, Hash[Symbol, Integer]]
|
14
|
+
|
15
|
+
DEFINED_SETTINGS: Hash[Symbol, Integer]
|
16
|
+
|
17
|
+
DEFINED_ERRORS: Hash[Symbol, Integer]
|
18
|
+
|
19
|
+
RBIT: Integer
|
20
|
+
RBYTE: Integer
|
21
|
+
EBIT: Integer
|
22
|
+
UINT32: String
|
23
|
+
UINT16: String
|
24
|
+
UINT8: String
|
25
|
+
HEADERPACK: String
|
26
|
+
FRAME_LENGTH_HISHIFT: Integer
|
27
|
+
FRAME_LENGTH_LOMASK: Integer
|
28
|
+
|
29
|
+
@local_max_frame_size: Integer
|
30
|
+
@remote_max_frame_size: Integer
|
31
|
+
|
3
32
|
attr_accessor local_max_frame_size: Integer
|
4
|
-
|
33
|
+
|
5
34
|
attr_accessor remote_max_frame_size: Integer
|
6
35
|
|
7
36
|
def common_header: (frame) -> String
|
@@ -14,11 +43,9 @@ module HTTP2Next
|
|
14
43
|
|
15
44
|
private
|
16
45
|
|
17
|
-
def initialize: (Integer, Integer) -> untyped
|
18
|
-
| (Integer) -> untyped
|
19
|
-
| () -> untyped
|
46
|
+
def initialize: (?Integer local_max_frame_size, ?Integer remote_max_frame_size) -> untyped
|
20
47
|
|
21
|
-
def pack_error: (Integer | Symbol
|
48
|
+
def pack_error: (Integer | Symbol error) -> String
|
22
49
|
|
23
50
|
def unpack_error: (Integer) -> (Symbol | Integer)
|
24
51
|
end
|
data/sig/header.rbs
CHANGED
@@ -11,5 +11,17 @@ module HTTP2Next
|
|
11
11
|
type context_hash = Hash[Symbol, Symbol | Integer]
|
12
12
|
|
13
13
|
type header_command = Hash[header_key, header_value]
|
14
|
+
|
15
|
+
HEADREP: Hash[Symbol, Hash[Symbol, Integer]]
|
16
|
+
|
17
|
+
NAIVE: Hash[Symbol, Symbol]
|
18
|
+
LINEAR: Hash[Symbol, Symbol]
|
19
|
+
STATIC: Hash[Symbol, Symbol]
|
20
|
+
SHORTER: Hash[Symbol, Symbol]
|
21
|
+
NAIVEH: Hash[Symbol, Symbol]
|
22
|
+
LINEARH: Hash[Symbol, Symbol]
|
23
|
+
STATICH: Hash[Symbol, Symbol]
|
24
|
+
SHORTERH: Hash[Symbol, Symbol]
|
25
|
+
|
14
26
|
end
|
15
27
|
end
|
data/sig/next.rbs
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
module HTTP2Next
|
2
|
+
VERSION: String
|
3
|
+
|
2
4
|
DEFAULT_FLOW_WINDOW: Integer
|
3
5
|
|
4
6
|
DEFAULT_HEADER_SIZE: Integer
|
@@ -7,7 +9,9 @@ module HTTP2Next
|
|
7
9
|
|
8
10
|
type settings_hash = Hash[Symbol, Integer]
|
9
11
|
|
10
|
-
type
|
12
|
+
type settings_ary = Array[settings_enum]
|
13
|
+
|
14
|
+
type settings_enum = Enumerable[[Symbol, Integer]]
|
11
15
|
|
12
16
|
SPEC_DEFAULT_CONNECTION_SETTINGS: settings_hash
|
13
17
|
|
@@ -17,14 +21,14 @@ module HTTP2Next
|
|
17
21
|
|
18
22
|
CONNECTION_PREFACE_MAGIC: String
|
19
23
|
|
20
|
-
REQUEST_MANDATORY_HEADERS: Array[
|
24
|
+
REQUEST_MANDATORY_HEADERS: Array[String]
|
21
25
|
|
22
|
-
RESPONSE_MANDATORY_HEADERS: Array[
|
26
|
+
RESPONSE_MANDATORY_HEADERS: Array[String]
|
23
27
|
|
24
|
-
type header_pair = [
|
28
|
+
type header_pair = [string, string]
|
25
29
|
|
26
30
|
# # FRAMES
|
27
|
-
|
31
|
+
type frame_control_flags = Array[:end_headers | :end_stream]
|
28
32
|
|
29
33
|
# # HEADERS
|
30
34
|
# type headers_frame = {
|
@@ -33,7 +37,9 @@ module HTTP2Next
|
|
33
37
|
# }
|
34
38
|
|
35
39
|
# # DATA
|
36
|
-
|
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 }
|
37
43
|
|
38
44
|
# # PUSH_PROMISE
|
39
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 }
|
@@ -45,7 +51,7 @@ module HTTP2Next
|
|
45
51
|
# type window_update_frame = { type: :window_update, stream: Integer, increment: Integer }
|
46
52
|
|
47
53
|
# # PRIORITY
|
48
|
-
|
54
|
+
type priority_frame = { type: :priority, stream: Integer, dependency: Integer, exclusive: bool, weight: Integer }
|
49
55
|
|
50
56
|
# # ALTSVC
|
51
57
|
# type altsvc_frame = { type: :altsvc, stream: 0, max_age: Integer, port: Integer, proto: "String", host: String }
|
data/sig/stream.rbs
CHANGED
@@ -4,7 +4,7 @@ module HTTP2Next
|
|
4
4
|
include Emitter
|
5
5
|
|
6
6
|
attr_reader id: Integer
|
7
|
-
attr_reader state: Symbol
|
7
|
+
attr_reader state: Symbol
|
8
8
|
attr_reader parent: Stream?
|
9
9
|
attr_reader weight: Integer
|
10
10
|
attr_reader dependency: Integer
|
@@ -42,7 +42,7 @@ module HTTP2Next
|
|
42
42
|
def cancel: () -> void
|
43
43
|
|
44
44
|
def refuse: () -> void
|
45
|
-
|
45
|
+
|
46
46
|
def window_update: (Integer increment) -> void
|
47
47
|
|
48
48
|
private
|
@@ -54,7 +54,7 @@ module HTTP2Next
|
|
54
54
|
?dependency: Integer,
|
55
55
|
?exclusive: bool,
|
56
56
|
?parent: Stream?,
|
57
|
-
?state: Symbol
|
57
|
+
?state: Symbol
|
58
58
|
) -> untyped
|
59
59
|
|
60
60
|
def transition: (frame, bool sending) -> void
|
@@ -63,7 +63,7 @@ module HTTP2Next
|
|
63
63
|
|
64
64
|
def complete_transition: (frame) -> void
|
65
65
|
|
66
|
-
def process_priority: (
|
66
|
+
def process_priority: ({weight: Integer, dependency: Integer, exclusive: bool}) -> void
|
67
67
|
|
68
68
|
def end_frame?: () -> bool
|
69
69
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: http-2-next
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tiago Cardoso
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2022-11-10 00:00:00.000000000 Z
|
14
14
|
dependencies: []
|
15
15
|
description: Pure-ruby HTTP 2.0 protocol implementation
|
16
16
|
email:
|
@@ -41,6 +41,7 @@ files:
|
|
41
41
|
- sig/client.rbs
|
42
42
|
- sig/connection.rbs
|
43
43
|
- sig/emitter.rbs
|
44
|
+
- sig/error.rbs
|
44
45
|
- sig/flow_buffer.rbs
|
45
46
|
- sig/frame_buffer.rbs
|
46
47
|
- sig/framer.rbs
|
@@ -52,10 +53,15 @@ files:
|
|
52
53
|
- sig/next.rbs
|
53
54
|
- sig/server.rbs
|
54
55
|
- sig/stream.rbs
|
55
|
-
homepage: https://gitlab.com/
|
56
|
+
homepage: https://gitlab.com/os85/http-2-next
|
56
57
|
licenses:
|
57
58
|
- MIT
|
58
|
-
metadata:
|
59
|
+
metadata:
|
60
|
+
bug_tracker_uri: https://gitlab.com/os85/http-2-next/issues
|
61
|
+
changelog_uri: https://gitlab.com/os85/http-2-next/-/blob/master/CHANGELOG.md
|
62
|
+
source_code_uri: https://gitlab.com/os85/http-2-next
|
63
|
+
homepage_uri: https://gitlab.com/os85/http-2-next
|
64
|
+
rubygems_mfa_required: 'true'
|
59
65
|
post_install_message:
|
60
66
|
rdoc_options: []
|
61
67
|
require_paths:
|
@@ -71,7 +77,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
71
77
|
- !ruby/object:Gem::Version
|
72
78
|
version: '0'
|
73
79
|
requirements: []
|
74
|
-
rubygems_version: 3.
|
80
|
+
rubygems_version: 3.3.7
|
75
81
|
signing_key:
|
76
82
|
specification_version: 4
|
77
83
|
summary: Pure-ruby HTTP 2.0 protocol implementation
|