diff options
-rw-r--r-- | lib/plum/frame_utils.rb | 14 | ||||
-rw-r--r-- | lib/plum/stream_helper.rb | 2 | ||||
-rw-r--r-- | test/plum/test_frame_utils.rb | 8 |
3 files changed, 17 insertions, 7 deletions
diff --git a/lib/plum/frame_utils.rb b/lib/plum/frame_utils.rb index c29b4a7..0093f89 100644 --- a/lib/plum/frame_utils.rb +++ b/lib/plum/frame_utils.rb @@ -49,12 +49,14 @@ module Plum # # @return [Hash<Symbol, Integer>] The parsed strings. def parse_settings - (self.length / 6).times.map {|i| - id = self.payload.uint16(6 * i) - val = self.payload.uint32(6 * i + 2) - name = Frame::SETTINGS_TYPE.key(id) or next nil - [name, val] - }.compact.to_h + settings = {} + payload.each_byteslice(6) do |param| + id = param.uint16 + name = Frame::SETTINGS_TYPE.key(id) + # ignore unknown settings type + settings[name] = param.uint32(2) if name + end + settings end end end diff --git a/lib/plum/stream_helper.rb b/lib/plum/stream_helper.rb index 5be440e..4ba7a14 100644 --- a/lib/plum/stream_helper.rb +++ b/lib/plum/stream_helper.rb @@ -33,7 +33,7 @@ module Plum def send_headers(headers, end_stream:) max = @connection.remote_settings[:max_frame_size] encoded = @connection.hpack_encoder.encode(headers) - original_frame = Frame.headers(id, encoded, :end_headers, (end_stream && :end_stream)) + original_frame = Frame.headers(id, encoded, :end_headers, (end_stream && :end_stream || nil)) original_frame.split_headers(max).each do |frame| send frame end diff --git a/test/plum/test_frame_utils.rb b/test/plum/test_frame_utils.rb index 65cc9d0..110fa5d 100644 --- a/test/plum/test_frame_utils.rb +++ b/test/plum/test_frame_utils.rb @@ -35,4 +35,12 @@ class FrameUtilsTest < Minitest::Test assert_equal("7", ret[2].payload) assert_equal([:end_headers], ret[2].flags) end + + def test_frame_parse_settings + # :header_table_size => 0x1010, :enable_push => 0x00, :header_table_size => 0x1011 (overwrite) + frame = Frame.new(type: :settings, flags: [], stream_id: 0, payload: "\x00\x01\x00\x00\x10\x10\x00\x02\x00\x00\x00\x00\x00\x01\x00\x00\x10\x11") + ret = frame.parse_settings + assert_equal(0x1011, ret[:header_table_size]) + assert_equal(0x0000, ret[:enable_push]) + end end |