summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKazuki Yamaguchi <k@rhe.jp>2015-08-11 22:43:07 +0900
committerKazuki Yamaguchi <k@rhe.jp>2015-08-11 22:43:07 +0900
commit014b637d6a1ebf5f152170f2b04be95da17dcb27 (patch)
tree65ca535e8294ed1ee81564acb6f3de09ca437503
parentaaa234f364962f2ff97b3209967658821e17f531 (diff)
downloadplum-014b637d6a1ebf5f152170f2b04be95da17dcb27.tar.gz
frame: make Frame mutable
-rw-r--r--lib/plum/frame.rb53
-rw-r--r--test/plum/test_connection.rb2
-rw-r--r--test/plum/test_frame.rb22
-rw-r--r--test/plum/test_frame_utils.rb2
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)