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 {