From fed5ea65bc7ac477379e9feda82f0e4d00a00e29 Mon Sep 17 00:00:00 2001 From: Kazuki Yamaguchi Date: Sun, 8 May 2016 21:58:19 +0900 Subject: frame: settings: add Frame::Settings.ack This is equivalent to Frame::Settings.new(:ack). --- lib/plum/connection.rb | 2 +- lib/plum/frame/settings.rb | 12 +++++++++--- test/plum/client/test_upgrade_client_session.rb | 2 +- test/plum/test_frame_factory.rb | 2 +- test/utils/client.rb | 2 +- 5 files changed, 13 insertions(+), 7 deletions(-) diff --git a/lib/plum/connection.rb b/lib/plum/connection.rb index d5c507b..2f177a6 100644 --- a/lib/plum/connection.rb +++ b/lib/plum/connection.rb @@ -198,7 +198,7 @@ module Plum callback(:remote_settings, @remote_settings, old_remote_settings) - send_immediately Frame::Settings.new(:ack) if send_ack + send_immediately Frame::Settings.ack if send_ack if @state == :waiting_settings @state = :open diff --git a/lib/plum/frame/settings.rb b/lib/plum/frame/settings.rb index 3bd13d4..7f7c2be 100644 --- a/lib/plum/frame/settings.rb +++ b/lib/plum/frame/settings.rb @@ -15,16 +15,22 @@ module Plum }.freeze # Creates a SETTINGS frame. - # @param ack [Symbol] Pass :ack to create an ACK frame. # @param args [Hash] The settings values to send. - def initialize(ack = nil, **args) + def initialize(**args) payload = String.new args.each { |key, value| id = SETTINGS_TYPE[key] or raise ArgumentError.new("invalid settings type: #{key}") payload.push_uint16(id) payload.push_uint32(value) } - initialize_base(type: :settings, stream_id: 0, flags: [ack], payload: payload) + initialize_base(type: :settings, stream_id: 0, payload: payload) + end + + # Creates a SETTINGS frame with ACK flag. + def self.ack + frame = allocate + frame.send(:initialize_base, type: :settings, stream_id: 0, flags_value: 0x01) + frame end # Parses SETTINGS frame payload. Ignores unknown settings type (see RFC7540 6.5.2). diff --git a/test/plum/client/test_upgrade_client_session.rb b/test/plum/client/test_upgrade_client_session.rb index 446462c..4c20e3b 100644 --- a/test/plum/client/test_upgrade_client_session.rb +++ b/test/plum/client/test_upgrade_client_session.rb @@ -22,7 +22,7 @@ class UpgradeClientSessionTest < Minitest::Test sock = StringSocket.new("HTTP/1.1 101\r\n\r\n") session = UpgradeClientSession.new(sock, Client::DEFAULT_CONFIG) sock.rio.string << Frame::Settings.new.assemble - sock.rio.string << Frame::Settings.new(:ack).assemble + sock.rio.string << Frame::Settings.ack.assemble res = session.request({ ":method" => "GET", ":path" => "/aa" }, "aa", {}) sock.rio.string << Frame::Headers.new(3, HPACK::Encoder.new(3).encode(":status" => "200", "content-length" => "3"), end_headers: true).assemble sock.rio.string << Frame::Data.new(3, "aaa", end_stream: true).assemble diff --git a/test/plum/test_frame_factory.rb b/test/plum/test_frame_factory.rb index a4253ba..df3093e 100644 --- a/test/plum/test_frame_factory.rb +++ b/test/plum/test_frame_factory.rb @@ -28,7 +28,7 @@ class FrameFactoryTest < Minitest::Test end def test_settings_ack - frame = Frame::Settings.new(:ack) + frame = Frame::Settings.ack assert_frame(frame, type: :settings, stream_id: 0, diff --git a/test/utils/client.rb b/test/utils/client.rb index f8937e2..ae8ca16 100644 --- a/test/utils/client.rb +++ b/test/utils/client.rb @@ -4,7 +4,7 @@ module ServerUtils def open_client_connection(scheme = :https) io = StringIO.new @_ccon = ClientConnection.new(io.method(:write)) - @_ccon << Frame::Settings.new(:ack).assemble + @_ccon << Frame::Settings.ack.assemble @_ccon << Frame::Settings.new.assemble if block_given? yield @_ccon -- cgit v1.2.3