For loss detection tuning, if user agent is available, save it into quicsession. protected by --gfe2_reloadable_flag_quic_save_user_agent_in_quic_session.

PiperOrigin-RevId: 316688269
Change-Id: I2a25beeb081b38ae204a62c14459427341efa5e0
diff --git a/quic/core/http/quic_spdy_stream.cc b/quic/core/http/quic_spdy_stream.cc
index 51f7c5c..4c979c1 100644
--- a/quic/core/http/quic_spdy_stream.cc
+++ b/quic/core/http/quic_spdy_stream.cc
@@ -529,6 +529,21 @@
 void QuicSpdyStream::OnStreamHeaderList(bool fin,
                                         size_t frame_len,
                                         const QuicHeaderList& header_list) {
+  if (GetQuicReloadableFlag(quic_save_user_agent_in_quic_session)) {
+    if (!spdy_session()->user_agent_id().has_value()) {
+      QUIC_RELOADABLE_FLAG_COUNT_N(quic_save_user_agent_in_quic_session, 3, 3);
+      std::string uaid;
+      for (const auto& kv : header_list) {
+        if (quiche::QuicheTextUtils::ToLower(kv.first) ==
+            kUserAgentHeaderName) {
+          uaid = kv.second;
+          break;
+        }
+      }
+      spdy_session()->SetUserAgentId(std::move(uaid));
+    }
+  }
+
   // TODO(b/134706391): remove |fin| argument.
   // When using Google QUIC, an empty header list indicates that the size limit
   // has been exceeded.