Skip to content

Commit cb304c8

Browse files
Ensure wire always contains a full H/2 frame (#15)
1 parent ee0a558 commit cb304c8

File tree

3 files changed

+15
-5
lines changed

3 files changed

+15
-5
lines changed

lib/protocol/http2/frame.rb

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ def self.parse_header(buffer)
146146
end
147147

148148
def read_header(stream)
149-
if buffer = stream.read(9) and buffer.bytesize == 9
149+
if buffer = stream.peek(9) and buffer.bytesize == 9
150150
@length, @type, @flags, @stream_id = Frame.parse_header(buffer)
151151
# puts "read_header: #{@length} #{@type} #{@flags} #{@stream_id}"
152152
else
@@ -155,8 +155,9 @@ def read_header(stream)
155155
end
156156

157157
def read_payload(stream)
158-
if payload = stream.read(@length) and payload.bytesize == @length
159-
@payload = payload
158+
length_with_header = 9 + @length
159+
if full_frame = stream.read(length_with_header) and full_frame.bytesize == length_with_header
160+
@payload = full_frame[9..]
160161
else
161162
raise EOFError, "Could not read frame payload!"
162163
end

lib/protocol/http2/framer.rb

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
# Released under the MIT License.
44
# Copyright, 2019-2024, by Samuel Williams.
55

6+
7+
require "async/io/stream"
8+
69
require_relative 'error'
710

811
require_relative 'data_frame'
@@ -37,7 +40,12 @@ module HTTP2
3740

3841
class Framer
3942
def initialize(stream, frames = FRAMES)
40-
@stream = stream
43+
@stream = case stream
44+
when Async::IO::Stream
45+
stream
46+
else
47+
Async::IO::Stream.new(stream)
48+
end
4149
@frames = frames
4250
end
4351

@@ -99,7 +107,7 @@ def write_frame(frame)
99107
end
100108

101109
def read_header
102-
if buffer = @stream.read(9)
110+
if buffer = @stream.peek(9)
103111
if buffer.bytesize == 9
104112
return Frame.parse_header(buffer)
105113
end

protocol-http2.gemspec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ Gem::Specification.new do |spec|
2424

2525
spec.required_ruby_version = ">= 3.1"
2626

27+
spec.add_dependency "async-io", "~> 1.37"
2728
spec.add_dependency "protocol-hpack", "~> 1.4"
2829
spec.add_dependency "protocol-http", "~> 0.18"
2930
end

0 commit comments

Comments
 (0)