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 {
