Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 1 addition & 4 deletions example/server.rb
Original file line number Diff line number Diff line change
Expand Up @@ -62,10 +62,7 @@
end

conn.on(:goaway) do
Thread.start do
sleep(1)
sock.close
end
sock.close
end

conn.on(:stream) do |stream|
Expand Down
2 changes: 0 additions & 2 deletions lib/http/2/connection.rb
Original file line number Diff line number Diff line change
Expand Up @@ -527,8 +527,6 @@ def connection_management(frame)
when :goaway
# 6.8. GOAWAY
# An endpoint MAY send multiple GOAWAY frames if circumstances change.
when :ping
ping_management(frame)
else
connection_error if (Process.clock_gettime(Process::CLOCK_MONOTONIC) - @closed_since) > 15
end
Expand Down
18 changes: 16 additions & 2 deletions lib/http/2/framer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ def initialize(local_max_frame_size = DEFAULT_MAX_FRAME_SIZE,
remote_max_frame_size = DEFAULT_MAX_FRAME_SIZE)
@local_max_frame_size = local_max_frame_size
@remote_max_frame_size = remote_max_frame_size
@frames = []
end

# Generates common 9-byte frame header.
Expand Down Expand Up @@ -371,6 +372,21 @@ def generate(frame)
#
# @param buf [Buffer]
def parse(buf)
while (frame = decode_frame(buf))
if frame[:type] == :ping
# PING responses SHOULD be given higher priority than any other frame.
@frames.unshift(frame)
else
@frames << frame
end
end

@frames.shift
end

private

def decode_frame(buf)
return if buf.size < 9

frame = read_common_header(buf)
Expand Down Expand Up @@ -491,8 +507,6 @@ def parse(buf)
frame
end

private

def pack_error(error, buffer:)
unless error.is_a? Integer
error = DEFINED_ERRORS[error]
Expand Down
5 changes: 4 additions & 1 deletion sig/framer.rbs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ module HTTP2

@local_max_frame_size: Integer
@remote_max_frame_size: Integer
@streams: Hash[Integer, Stream]

attr_accessor local_max_frame_size: Integer

Expand All @@ -47,12 +48,14 @@ module HTTP2

def generate: (frame) -> String

def parse: (String) -> frame?
def parse: (String buf) -> frame?

private

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

def decode_frame: (String buf) -> frame?

def pack_error: (Integer | Symbol error, buffer: String) -> String

def unpack_error: (Integer) -> (Symbol | Integer)
Expand Down
10 changes: 10 additions & 0 deletions spec/shared_examples/connection.rb
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,16 @@
expect(pong).to eq "12345678"
end

it "should not fire callback on PONG if connection is closed" do
conn << f.generate(settings_frame)
conn << f.generate(goaway_frame)

pong = nil
conn.ping("12345678") { |d| pong = d }
conn << f.generate(pong_frame)
expect(pong).to be_nil
end

it "should fire callback on receipt of GOAWAY" do
last_stream, payload, error = nil
conn << f.generate(settings_frame)
Expand Down