diff options
author | Kazuki Yamaguchi <k@rhe.jp> | 2015-08-11 22:43:07 +0900 |
---|---|---|
committer | Kazuki Yamaguchi <k@rhe.jp> | 2015-08-11 22:43:07 +0900 |
commit | 014b637d6a1ebf5f152170f2b04be95da17dcb27 (patch) | |
tree | 65ca535e8294ed1ee81564acb6f3de09ca437503 | |
parent | aaa234f364962f2ff97b3209967658821e17f531 (diff) | |
download | plum-014b637d6a1ebf5f152170f2b04be95da17dcb27.tar.gz |
frame: make Frame mutable
-rw-r--r-- | lib/plum/frame.rb | 53 | ||||
-rw-r--r-- | test/plum/test_connection.rb | 2 | ||||
-rw-r--r-- | test/plum/test_frame.rb | 22 | ||||
-rw-r--r-- | test/plum/test_frame_utils.rb | 2 |
4 files changed, 50 insertions, 29 deletions
diff --git a/lib/plum/frame.rb b/lib/plum/frame.rb index 18b20a2..ae7a532 100644 --- a/lib/plum/frame.rb +++ b/lib/plum/frame.rb @@ -68,35 +68,53 @@ module Plum # | Frame Payload (0...) ... # +---------------------------------------------------------------+ - # [Integer] The length of payload. unsigned 24-bit integer - attr_reader :length # [Integer] Frame type. 8-bit - attr_reader :type_value + attr_accessor :type_value # [Integer] Flags. 8-bit - attr_reader :flags_value + attr_accessor :flags_value # [Integer] Stream Identifier. unsigned 31-bit integer - attr_reader :stream_id + attr_accessor :stream_id # [String] The payload. - attr_reader :payload - - def initialize(length: nil, type: nil, type_value: nil, flags: nil, flags_value: nil, stream_id: nil, payload: nil) - @payload = (payload || "").freeze - @length = length || @payload.bytesize - @type_value = type_value || FRAME_TYPES[type] or raise ArgumentError.new("type_value or type is necessary") - @flags_value = flags_value || (flags && flags.map {|flag| FRAME_FLAGS[self.type][flag] }.inject(:|)) || 0 - @stream_id = stream_id or raise ArgumentError.new("stream_id is necessary") + attr_accessor :payload + + def initialize(type: nil, type_value: nil, flags: nil, flags_value: nil, stream_id: nil, payload: nil) + self.payload = (payload || "") + self.type_value = type_value or self.type = type + self.flags_value = flags_value or self.flags = flags + self.stream_id = stream_id or raise ArgumentError.new("stream_id is necessary") + end + + # Returns the length of payload. + # @return [Integer] The length. + def length + @payload.bytesize end # Returns the type of the frame in Symbol. # @return [Symbol] The type. def type - @_type ||= FRAME_TYPES.key(type_value) || ("unknown_%01A" % type_value).to_sym + FRAME_TYPES.key(type_value) || ("unknown_%02x" % type_value).to_sym + end + + # Sets the frame type. + # @param value [Symbol] The type. + def type=(value) + self.type_value = FRAME_TYPES[value] or raise ArgumentError.new("unknown frame type: #{value}") end # Returns the set flags on the frame. # @return [Array<Symbol>] The flags. def flags - @_flags ||= FRAME_FLAGS[type].select {|name, value| value & flags_value > 0 }.map {|name, value| name }.freeze + fs = FRAME_FLAGS[type] + [0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80] + .select {|v| flags_value & v > 0 } + .map {|val| fs && fs.key(val) || ("unknown_%02x" % val).to_sym } + end + + # Sets the frame flags. + # @param value [Array<Symbol>] The flags. + def flags=(value) + self.flags_value = (value && value.map {|flag| FRAME_FLAGS[self.type][flag] }.inject(:|) || 0) end # Assembles the frame into binary representation. @@ -136,7 +154,10 @@ module Plum r = r_sid >> 31 stream_id = r_sid & ~(1 << 31) - self.new(length: length, type_value: type_value, flags_value: flags_value, stream_id: stream_id, payload: payload) + self.new(type_value: type_value, + flags_value: flags_value, + stream_id: stream_id, + payload: payload).freeze end end end diff --git a/test/plum/test_connection.rb b/test/plum/test_connection.rb index cd103d2..4c9668b 100644 --- a/test/plum/test_connection.rb +++ b/test/plum/test_connection.rb @@ -49,7 +49,7 @@ class ConnectionTest < Minitest::Test def test_server_ignore_unknown_frame_type open_server_connection {|con| assert_no_error { - con << Frame.new(type_value: 0x0f, stream_id: 0).assemble + con << "\x00\x00\x00\x0f\x00\x00\x00\x00\x00" # type: 0x0f, no flags, no payload, stream 0 } } end diff --git a/test/plum/test_frame.rb b/test/plum/test_frame.rb index 285f4f1..56614d8 100644 --- a/test/plum/test_frame.rb +++ b/test/plum/test_frame.rb @@ -18,11 +18,11 @@ class FrameTest < Minitest::Test def test_parse # R 0x1, stream_id 0x4, body "abc" - buffer = "\x00\x00\x03" << "\x00" << "\x20" << "\x80\x00\x00\x04" << "abc" << "next_frame_data" + buffer = "\x00\x00\x03" << "\x00" << "\x09" << "\x80\x00\x00\x04" << "abc" << "next_frame_data" frame = Plum::Frame.parse!(buffer) assert_equal(frame.length, 3) - assert_equal(frame.type_value, 0x00) - assert_equal(frame.flags_value, 0x20) + assert_equal(frame.type, :data) + assert_equal(frame.flags, [:end_stream, :padded]) assert_equal(frame.stream_id, 0x04) assert_equal(frame.payload, "abc") assert_equal(buffer, "next_frame_data") @@ -30,8 +30,8 @@ class FrameTest < Minitest::Test # Frame#assemble def test_assemble - frame = Plum::Frame.new(length: 4, type_value: 5, flags_value: 0x5f, stream_id: 0x678, payload: "payl") - bin = "\x00\x00\x04" << "\x05" << "\x5f" << "\x00\x00\x06\x78" << "payl" + frame = Plum::Frame.new(type: :push_promise, flags: [:end_headers, :padded], stream_id: 0x678, payload: "payl") + bin = "\x00\x00\x04" << "\x05" << "\x0c" << "\x00\x00\x06\x78" << "payl" assert_equal(frame.assemble, bin) end @@ -40,12 +40,12 @@ class FrameTest < Minitest::Test frame = Plum::Frame.new(type: :data, stream_id: 12345, flags: [:end_stream, :padded], - payload: "ぺいろーど") - assert_equal(frame.payload, "ぺいろーど") - assert_equal(frame.length, "ぺいろーど".bytesize) - assert_equal(frame.type_value, 0x00) # DATA - assert_equal(frame.flags_value, 0x09) # 0x01 | 0x08 - assert_equal(frame.stream_id, 12345) + payload: "ぺいろーど".encode(Encoding::UTF_8)) + assert_equal("ぺいろーど", frame.payload) + assert_equal("ぺいろーど".bytesize, frame.length) + assert_equal(:data, frame.type) # DATA + assert_equal([:end_stream, :padded], frame.flags) # 0x01 | 0x08 + assert_equal(12345, frame.stream_id) end def test_inspect diff --git a/test/plum/test_frame_utils.rb b/test/plum/test_frame_utils.rb index 110fa5d..4564e9a 100644 --- a/test/plum/test_frame_utils.rb +++ b/test/plum/test_frame_utils.rb @@ -29,7 +29,7 @@ class FrameUtilsTest < Minitest::Test ret = frame.split_headers(3) assert_equal(3, ret.size) assert_equal("123", ret[0].payload) - assert_equal([:priority, :end_stream].sort, ret[0].flags.sort) + assert_equal([:end_stream, :priority], ret[0].flags) assert_equal("456", ret[1].payload) assert_equal([], ret[1].flags) assert_equal("7", ret[2].payload) |