Factors out a `HandleOutboundSettings()` method from the existing `PrepareSettingsFrame()` method. This is some minor refactoring in preparation for changes to how we handle outbound SETTINGS frames. PiperOrigin-RevId: 428046860
diff --git a/http2/adapter/oghttp2_session.cc b/http2/adapter/oghttp2_session.cc index 8a85c36..a3dd8b8 100644 --- a/http2/adapter/oghttp2_session.cc +++ b/http2/adapter/oghttp2_session.cc
@@ -990,7 +990,9 @@ } void OgHttp2Session::SubmitSettings(absl::Span<const Http2Setting> settings) { - EnqueueFrame(PrepareSettingsFrame(settings)); + auto frame = PrepareSettingsFrame(settings); + HandleOutboundSettings(*frame); + EnqueueFrame(std::move(frame)); } void OgHttp2Session::OnError(SpdyFramerError error, @@ -1486,7 +1488,9 @@ } // First frame must be a non-ack SETTINGS. if (frames_.empty() || !IsNonAckSettings(*frames_.front())) { - frames_.push_front(PrepareSettingsFrame(GetInitialSettings())); + auto frame = PrepareSettingsFrame(GetInitialSettings()); + HandleOutboundSettings(*frame); + frames_.push_front(std::move(frame)); } queued_preface_ = true; } @@ -1515,12 +1519,17 @@ auto settings_ir = absl::make_unique<SpdySettingsIR>(); for (const Http2Setting& setting : settings) { settings_ir->AddSetting(setting.id, setting.value); + } + return settings_ir; +} - if (setting.id == Http2KnownSettingsId::MAX_CONCURRENT_STREAMS) { - pending_max_inbound_concurrent_streams_ = setting.value; +void OgHttp2Session::HandleOutboundSettings( + const spdy::SpdySettingsIR& settings_frame) { + for (const auto& [id, value] : settings_frame.values()) { + if (id == Http2KnownSettingsId::MAX_CONCURRENT_STREAMS) { + pending_max_inbound_concurrent_streams_ = value; } - if (setting.id == ENABLE_CONNECT_PROTOCOL && setting.value == 1u && - IsServerSession()) { + if (id == ENABLE_CONNECT_PROTOCOL && value == 1u && IsServerSession()) { // Allow extended CONNECT semantics even before SETTINGS are acked, to // make things easier for clients. headers_handler_.AllowConnect(); @@ -1530,17 +1539,15 @@ // Copy the (small) map of settings we are about to send so that we can set // values in the SETTINGS ack callback. settings_ack_callbacks_.push_back( - [this, settings_map = settings_ir->values()]() { - for (const auto id_and_value : settings_map) { - if (id_and_value.first == spdy::SETTINGS_MAX_CONCURRENT_STREAMS) { - max_inbound_concurrent_streams_ = id_and_value.second; - } else if (id_and_value.first == spdy::SETTINGS_HEADER_TABLE_SIZE) { - decoder_.GetHpackDecoder()->ApplyHeaderTableSizeSetting( - id_and_value.second); + [this, settings_map = settings_frame.values()]() { + for (const auto& [id, value] : settings_map) { + if (id == spdy::SETTINGS_MAX_CONCURRENT_STREAMS) { + max_inbound_concurrent_streams_ = value; + } else if (id == spdy::SETTINGS_HEADER_TABLE_SIZE) { + decoder_.GetHpackDecoder()->ApplyHeaderTableSizeSetting(value); } } }); - return settings_ir; } void OgHttp2Session::SendWindowUpdate(Http2StreamId stream_id,
diff --git a/http2/adapter/oghttp2_session.h b/http2/adapter/oghttp2_session.h index 6efa032..29bff34 100644 --- a/http2/adapter/oghttp2_session.h +++ b/http2/adapter/oghttp2_session.h
@@ -299,6 +299,9 @@ std::unique_ptr<spdy::SpdySettingsIR> PrepareSettingsFrame( absl::Span<const Http2Setting> settings); + // Updates internal state to match the SETTINGS advertised to the peer. + void HandleOutboundSettings(const spdy::SpdySettingsIR& settings_frame); + void SendWindowUpdate(Http2StreamId stream_id, size_t update_delta); enum class SendResult {