diff options
author | Kazuki Yamaguchi <k@rhe.jp> | 2015-08-06 11:13:37 +0900 |
---|---|---|
committer | Kazuki Yamaguchi <k@rhe.jp> | 2015-08-06 11:13:37 +0900 |
commit | bb9b7d972a45d026fe5e12b57eb352c1f0631ff7 (patch) | |
tree | c1a89c058f8c61a21b001ab610bf0cc3b71b963c | |
parent | e508d5b63ebd370bc977ab2c6748dd8f95b2dbae (diff) | |
download | plum-bb9b7d972a45d026fe5e12b57eb352c1f0631ff7.tar.gz |
endpoint MUST discard unsupported (unknown) frame
-rw-r--r-- | lib/plum/frame.rb | 2 | ||||
-rw-r--r-- | lib/plum/server_connection.rb | 4 | ||||
-rw-r--r-- | lib/plum/stream.rb | 4 | ||||
-rw-r--r-- | test/plum/test_server_connection.rb | 8 | ||||
-rw-r--r-- | test/plum/test_stream.rb | 8 |
5 files changed, 23 insertions, 3 deletions
diff --git a/lib/plum/frame.rb b/lib/plum/frame.rb index 1cb2933..67316b5 100644 --- a/lib/plum/frame.rb +++ b/lib/plum/frame.rb @@ -89,7 +89,7 @@ module Plum # Returns the type of the frame in Symbol. # @return [Symbol] The type. def type - @_type ||= FRAME_TYPES.key(type_value) + @_type ||= FRAME_TYPES.key(type_value) || ("unknown_%01A" % type_value).to_sym end # Returns the set flags on the frame. diff --git a/lib/plum/server_connection.rb b/lib/plum/server_connection.rb index de5c3e2..d75947f 100644 --- a/lib/plum/server_connection.rb +++ b/lib/plum/server_connection.rb @@ -186,8 +186,10 @@ module Plum process_ping(frame) when :goaway close - else # :data, :headers, :priority, :rst_stream, :push_promise, :continuation + when :data, :headers, :priority, :rst_stream, :push_promise, :continuation raise Plum::ConnectionError.new(:protocol_error) + else + # MUST ignore unknown frame type. end end diff --git a/lib/plum/stream.rb b/lib/plum/stream.rb index b7e3029..98df787 100644 --- a/lib/plum/stream.rb +++ b/lib/plum/stream.rb @@ -46,8 +46,10 @@ module Plum process_window_update(frame) when :continuation process_continuation(frame) - else # :ping, :goaway, :settings, :push_promise + when :ping, :goaway, :settings, :push_promise raise Plum::ConnectionError.new(:protocol_error) # stream_id MUST be 0x00 + else + # MUST ignore unknown frame end rescue Plum::StreamError => e callback(:stream_error, e) diff --git a/test/plum/test_server_connection.rb b/test/plum/test_server_connection.rb index 032275a..5bfdf98 100644 --- a/test/plum/test_server_connection.rb +++ b/test/plum/test_server_connection.rb @@ -24,6 +24,14 @@ class ServerConnectionTest < Minitest::Test end end + def test_server_ignore_unknown_frame_type + open_server_connection {|con| + refute_raises { + con << Frame.new(type_value: 0x0f, stream_id: 0).assemble + } + } + end + def test_server_raise_cprotocol_error_client_start_even_stream_id con = open_server_connection assert_connection_error(:protocol_error) { diff --git a/test/plum/test_stream.rb b/test/plum/test_stream.rb index 19162e7..ebe881f 100644 --- a/test/plum/test_stream.rb +++ b/test/plum/test_stream.rb @@ -11,6 +11,14 @@ class StreamTest < Minitest::Test } end + def test_stream_unknown_frame_type + open_new_stream {|stream| + refute_raises { + stream.process_frame(Frame.new(type_value: 0x0f, stream_id: stream.id, payload: "\x00\x00\x00\x00")) + } + } + end + def test_stream_close open_new_stream(state: :half_closed_local) {|stream| stream.close(StreamError.new(:frame_size_error).http2_error_code) |