aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/plum/connection.rb1
-rw-r--r--test/plum/connection/test_handle_frame.rb3
-rw-r--r--test/plum/test_flow_control.rb43
3 files changed, 46 insertions, 1 deletions
diff --git a/lib/plum/connection.rb b/lib/plum/connection.rb
index 188b172..32a7d2e 100644
--- a/lib/plum/connection.rb
+++ b/lib/plum/connection.rb
@@ -125,6 +125,7 @@ module Plum
def receive_frame(frame)
validate_received_frame(frame)
+ consume_recv_window(frame)
if frame.stream_id == 0
receive_control_frame(frame)
diff --git a/test/plum/connection/test_handle_frame.rb b/test/plum/connection/test_handle_frame.rb
index eee44db..6aa7db7 100644
--- a/test/plum/connection/test_handle_frame.rb
+++ b/test/plum/connection/test_handle_frame.rb
@@ -14,6 +14,9 @@ class ServerConnectionHandleFrameTest < Minitest::Test
def test_server_handle_settings
open_server_connection {|con|
+ assert_no_error {
+ con << Frame.new(type: :settings, stream_id: 0, flags: [:ack], payload: "").assemble
+ }
assert_connection_error(:frame_size_error) {
con << Frame.new(type: :settings, stream_id: 0, flags: [:ack], payload: "\x00").assemble
}
diff --git a/test/plum/test_flow_control.rb b/test/plum/test_flow_control.rb
index 5e299e0..758472d 100644
--- a/test/plum/test_flow_control.rb
+++ b/test/plum/test_flow_control.rb
@@ -97,7 +97,7 @@ class FlowControlTest < Minitest::Test
}
end
- def test_flow_control_update_initial_window_size
+ def test_flow_control_update_send_initial_window_size
open_new_stream {|stream|
con = stream.connection
con << Frame.new(type: :settings,
@@ -123,4 +123,45 @@ class FlowControlTest < Minitest::Test
assert_equal(3, last.payload.uint32)
}
end
+
+ def test_flow_control_recv_window_exceeded
+ prepare = ->(&blk) {
+ open_new_stream {|stream|
+ con = stream.connection
+ con.settings(initial_window_size: 24)
+ blk.call(con, stream)
+ }
+ }
+
+ prepare.call {|con, stream|
+ con.window_update(500) # extend only connection
+ con << Frame.headers(stream.id, "", :end_headers).assemble
+ assert_stream_error(:flow_control_error) {
+ con << Frame.data(stream.id, "\x00" * 30, :end_stream).assemble
+ }
+ }
+
+ prepare.call {|con, stream|
+ stream.window_update(500) # extend only stream
+ con << Frame.headers(stream.id, "", :end_headers).assemble
+ assert_connection_error(:flow_control_error) {
+ con << Frame.data(stream.id, "\x00" * 30, :end_stream).assemble
+ }
+ }
+ end
+
+ def test_flow_control_update_recv_initial_window_size
+ open_new_stream {|stream|
+ con = stream.connection
+ con.settings(initial_window_size: 24)
+ stream.window_update(1)
+ con << Frame.headers(stream.id, "", :end_headers).assemble
+ con << Frame.data(stream.id, "\x00" * 20, :end_stream).assemble
+ assert_equal(4, con.recv_remaining_window)
+ assert_equal(5, stream.recv_remaining_window)
+ con.settings(initial_window_size: 60)
+ assert_equal(40, con.recv_remaining_window)
+ assert_equal(41, stream.recv_remaining_window)
+ }
+ end
end