aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKazuki Yamaguchi <k@rhe.jp>2015-08-06 11:13:37 +0900
committerKazuki Yamaguchi <k@rhe.jp>2015-08-06 11:13:37 +0900
commitbb9b7d972a45d026fe5e12b57eb352c1f0631ff7 (patch)
treec1a89c058f8c61a21b001ab610bf0cc3b71b963c
parente508d5b63ebd370bc977ab2c6748dd8f95b2dbae (diff)
downloadplum-bb9b7d972a45d026fe5e12b57eb352c1f0631ff7.tar.gz
endpoint MUST discard unsupported (unknown) frame
-rw-r--r--lib/plum/frame.rb2
-rw-r--r--lib/plum/server_connection.rb4
-rw-r--r--lib/plum/stream.rb4
-rw-r--r--test/plum/test_server_connection.rb8
-rw-r--r--test/plum/test_stream.rb8
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)