Skip to content

Commit e197bbb

Browse files
eager-decode-then reorder received frames
the immediate benefit of eager-decoding frames is that one can push PING frames to the top of the stack, thereby prioritizing its processing.
1 parent 071b575 commit e197bbb

2 files changed

Lines changed: 20 additions & 3 deletions

File tree

lib/http/2/framer.rb

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ def initialize(local_max_frame_size = DEFAULT_MAX_FRAME_SIZE,
119119
remote_max_frame_size = DEFAULT_MAX_FRAME_SIZE)
120120
@local_max_frame_size = local_max_frame_size
121121
@remote_max_frame_size = remote_max_frame_size
122+
@frames = []
122123
end
123124

124125
# Generates common 9-byte frame header.
@@ -371,6 +372,21 @@ def generate(frame)
371372
#
372373
# @param buf [Buffer]
373374
def parse(buf)
375+
while (frame = decode_frame(buf))
376+
if frame[:type] == :ping
377+
# PING responses SHOULD be given higher priority than any other frame.
378+
@frames.unshift(frame)
379+
else
380+
@frames << frame
381+
end
382+
end
383+
384+
@frames.shift
385+
end
386+
387+
private
388+
389+
def decode_frame(buf)
374390
return if buf.size < 9
375391

376392
frame = read_common_header(buf)
@@ -491,8 +507,6 @@ def parse(buf)
491507
frame
492508
end
493509

494-
private
495-
496510
def pack_error(error, buffer:)
497511
unless error.is_a? Integer
498512
error = DEFINED_ERRORS[error]

sig/framer.rbs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ module HTTP2
3434

3535
@local_max_frame_size: Integer
3636
@remote_max_frame_size: Integer
37+
@streams: Hash[Integer, Stream]
3738

3839
attr_accessor local_max_frame_size: Integer
3940

@@ -47,12 +48,14 @@ module HTTP2
4748

4849
def generate: (frame) -> String
4950

50-
def parse: (String) -> frame?
51+
def parse: (String buf) -> frame?
5152

5253
private
5354

5455
def initialize: (?Integer local_max_frame_size, ?Integer remote_max_frame_size) -> untyped
5556

57+
def decode_frame: (String buf) -> frame?
58+
5659
def pack_error: (Integer | Symbol error, buffer: String) -> String
5760

5861
def unpack_error: (Integer) -> (Symbol | Integer)

0 commit comments

Comments
 (0)