Deprecate quic_ignore_user_agent_transport_parameter

This CL deprecates gfe2_reloadable_flag_quic_ignore_user_agent_transport_parameter, meaning that we will now completely ignore the Google-specific user agent transport parameter when it is received. This CL also changes clients to stop sending that transport parameter. Note that the user agent is still sent on HTTP request headers so there is no loss of information here.

PiperOrigin-RevId: 425912166
diff --git a/quic/core/crypto/transport_parameters.cc b/quic/core/crypto/transport_parameters.cc
index 6ca4b24..0d828db 100644
--- a/quic/core/crypto/transport_parameters.cc
+++ b/quic/core/crypto/transport_parameters.cc
@@ -54,7 +54,7 @@
 
   kInitialRoundTripTime = 0x3127,
   kGoogleConnectionOptions = 0x3128,
-  kGoogleUserAgentId = 0x3129,
+  // 0x3129 was used to convey the user agent string.
   // 0x312A was used only in T050 to indicate support for HANDSHAKE_DONE.
   // 0x312B was used to indicate that QUIC+TLS key updates were not supported.
   // 0x4751 was used for non-standard Google-specific parameters encoded as a
@@ -122,8 +122,6 @@
       return "initial_round_trip_time";
     case TransportParameters::kGoogleConnectionOptions:
       return "google_connection_options";
-    case TransportParameters::kGoogleUserAgentId:
-      return "user_agent_id";
     case TransportParameters::kGoogleQuicVersion:
       return "google-version";
     case TransportParameters::kMinAckDelay:
@@ -162,8 +160,6 @@
       return true;
     case TransportParameters::kVersionInformation:
       return GetQuicReloadableFlag(quic_version_information);
-    case TransportParameters::kGoogleUserAgentId:
-      return !GetQuicReloadableFlag(quic_ignore_user_agent_transport_parameter);
   }
   return false;
 }
@@ -443,10 +439,6 @@
       rv += QuicTagToString(connection_option);
     }
   }
-  if (user_agent_id.has_value()) {
-    rv += " " + TransportParameterIdToString(kGoogleUserAgentId) + " \"" +
-          user_agent_id.value() + "\"";
-  }
   for (const auto& kv : custom_parameters) {
     absl::StrAppend(&rv, " 0x", absl::Hex(static_cast<uint32_t>(kv.first)),
                     "=");
@@ -520,7 +512,6 @@
       max_datagram_frame_size(other.max_datagram_frame_size),
       initial_round_trip_time_us(other.initial_round_trip_time_us),
       google_connection_options(other.google_connection_options),
-      user_agent_id(other.user_agent_id),
       custom_parameters(other.custom_parameters) {
   if (other.preferred_address) {
     preferred_address = std::make_unique<TransportParameters::PreferredAddress>(
@@ -561,7 +552,6 @@
         initial_round_trip_time_us.value() ==
             rhs.initial_round_trip_time_us.value() &&
         google_connection_options == rhs.google_connection_options &&
-        user_agent_id == rhs.user_agent_id &&
         custom_parameters == rhs.custom_parameters)) {
     return false;
   }
@@ -636,10 +626,6 @@
     *error_details = "Server cannot send initial round trip time";
     return false;
   }
-  if (perspective == Perspective::IS_SERVER && user_agent_id.has_value()) {
-    *error_details = "Server cannot send user agent ID";
-    return false;
-  }
   if (version_information.has_value()) {
     const QuicVersionLabel& chosen_version =
         version_information.value().chosen_version;
@@ -748,7 +734,6 @@
       kIntegerParameterLength +           // max_datagram_frame_size
       kIntegerParameterLength +           // initial_round_trip_time_us
       kTypeAndValueLength +               // google_connection_options
-      kTypeAndValueLength +               // user_agent_id
       kTypeAndValueLength;                // google-version
 
   std::vector<TransportParameters::TransportParameterId> parameter_ids = {
@@ -773,7 +758,6 @@
       TransportParameters::kInitialSourceConnectionId,
       TransportParameters::kRetrySourceConnectionId,
       TransportParameters::kGoogleConnectionOptions,
-      TransportParameters::kGoogleUserAgentId,
       TransportParameters::kGoogleQuicVersion,
       TransportParameters::kVersionInformation,
   };
@@ -784,10 +768,6 @@
     max_transport_param_length +=
         in.google_connection_options.value().size() * sizeof(QuicTag);
   }
-  // user_agent_id.
-  if (in.user_agent_id.has_value()) {
-    max_transport_param_length += in.user_agent_id.value().length();
-  }
   // Google-specific version extension.
   if (in.legacy_version_information.has_value()) {
     max_transport_param_length +=
@@ -1112,18 +1092,6 @@
           }
         }
       } break;
-      // Google-specific user agent identifier.
-      case TransportParameters::kGoogleUserAgentId: {
-        if (in.user_agent_id.has_value()) {
-          if (!writer.WriteVarInt62(TransportParameters::kGoogleUserAgentId) ||
-              !writer.WriteStringPieceVarInt62(in.user_agent_id.value())) {
-            QUIC_BUG(Failed to write Google user agent ID)
-                << "Failed to write Google user agent ID \""
-                << in.user_agent_id.value() << "\" for " << in;
-            return false;
-          }
-        }
-      } break;
       // Google-specific version extension.
       case TransportParameters::kGoogleQuicVersion: {
         if (!in.legacy_version_information.has_value()) {
@@ -1446,29 +1414,6 @@
           out->google_connection_options.value().push_back(connection_option);
         }
       } break;
-      case TransportParameters::kGoogleUserAgentId:
-        if (GetQuicReloadableFlag(quic_ignore_user_agent_transport_parameter)) {
-          QUIC_RELOADABLE_FLAG_COUNT(
-              quic_ignore_user_agent_transport_parameter);
-          // This is a copy of the default switch statement below.
-          // TODO(dschinazi) remove this case entirely when deprecating the
-          // quic_ignore_user_agent_transport_parameter flag.
-          if (out->custom_parameters.find(param_id) !=
-              out->custom_parameters.end()) {
-            *error_details = "Received a second unknown parameter" +
-                             TransportParameterIdToString(param_id);
-            return false;
-          }
-          out->custom_parameters[param_id] =
-              std::string(value_reader.ReadRemainingPayload());
-          break;
-        }
-        if (out->user_agent_id.has_value()) {
-          *error_details = "Received a second user_agent_id";
-          return false;
-        }
-        out->user_agent_id = std::string(value_reader.ReadRemainingPayload());
-        break;
       case TransportParameters::kGoogleQuicVersion: {
         if (!out->legacy_version_information.has_value()) {
           out->legacy_version_information =
diff --git a/quic/core/crypto/transport_parameters.h b/quic/core/crypto/transport_parameters.h
index 74f05bb..1b6f516 100644
--- a/quic/core/crypto/transport_parameters.h
+++ b/quic/core/crypto/transport_parameters.h
@@ -260,9 +260,6 @@
   // Google-specific connection options.
   absl::optional<QuicTagVector> google_connection_options;
 
-  // Google-specific user agent identifier.
-  absl::optional<std::string> user_agent_id;
-
   // Validates whether transport parameters are valid according to
   // the specification. If the transport parameters are not valid, this method
   // will write a human-readable error message to |error_details|.
diff --git a/quic/core/crypto/transport_parameters_test.cc b/quic/core/crypto/transport_parameters_test.cc
index 111d43a..c9df18a 100644
--- a/quic/core/crypto/transport_parameters_test.cc
+++ b/quic/core/crypto/transport_parameters_test.cc
@@ -127,10 +127,6 @@
           MakeQuicTag('H', 'I', 'J', 0xff)};
 }
 
-std::string CreateFakeUserAgentId() {
-  return "FakeUAID";
-}
-
 void RemoveGreaseParameters(TransportParameters* params) {
   std::vector<TransportParameters::TransportParameterId> grease_params;
   for (const auto& kv : params->custom_parameters) {
@@ -290,7 +286,6 @@
   orig_params.retry_source_connection_id = CreateFakeRetrySourceConnectionId();
   orig_params.initial_round_trip_time_us.set_value(kFakeInitialRoundTripTime);
   orig_params.google_connection_options = CreateFakeGoogleConnectionOptions();
-  orig_params.user_agent_id = CreateFakeUserAgentId();
   orig_params.custom_parameters[kCustomParameter1] = kCustomParameter1Value;
   orig_params.custom_parameters[kCustomParameter2] = kCustomParameter2Value;
 
@@ -327,9 +322,6 @@
       CreateFakeInitialSourceConnectionId();
   orig_params.initial_round_trip_time_us.set_value(kFakeInitialRoundTripTime);
   orig_params.google_connection_options = CreateFakeGoogleConnectionOptions();
-  if (!GetQuicReloadableFlag(quic_ignore_user_agent_transport_parameter)) {
-    orig_params.user_agent_id = CreateFakeUserAgentId();
-  }
   orig_params.custom_parameters[kCustomParameter1] = kCustomParameter1Value;
   orig_params.custom_parameters[kCustomParameter2] = kCustomParameter2Value;
 
@@ -573,10 +565,6 @@
       'A', 'L', 'P', 'N',  // value
       'E', 'F', 'G', 0x00,
       'H', 'I', 'J', 0xff,
-      // user_agent_id
-      0x71, 0x29,  // parameter id
-      0x08,  // length
-      'F', 'a', 'k', 'e', 'U', 'A', 'I', 'D',  // value
       // Google version extension
       0x80, 0x00, 0x47, 0x52,  // parameter id
       0x04,  // length
@@ -641,12 +629,6 @@
   ASSERT_TRUE(new_params.google_connection_options.has_value());
   EXPECT_EQ(CreateFakeGoogleConnectionOptions(),
             new_params.google_connection_options.value());
-  if (!GetQuicReloadableFlag(quic_ignore_user_agent_transport_parameter)) {
-    ASSERT_TRUE(new_params.user_agent_id.has_value());
-    EXPECT_EQ(CreateFakeUserAgentId(), new_params.user_agent_id.value());
-  } else {
-    EXPECT_FALSE(new_params.user_agent_id.has_value());
-  }
 }
 
 TEST_P(TransportParametersTest,
@@ -919,7 +901,6 @@
   ASSERT_TRUE(new_params.google_connection_options.has_value());
   EXPECT_EQ(CreateFakeGoogleConnectionOptions(),
             new_params.google_connection_options.value());
-  EXPECT_FALSE(new_params.user_agent_id.has_value());
 }
 
 TEST_P(TransportParametersTest, ParseServerParametersRepeated) {
@@ -1037,7 +1018,6 @@
       CreateFakeInitialSourceConnectionId();
   orig_params.initial_round_trip_time_us.set_value(kFakeInitialRoundTripTime);
   orig_params.google_connection_options = CreateFakeGoogleConnectionOptions();
-  orig_params.user_agent_id = CreateFakeUserAgentId();
   orig_params.custom_parameters[kCustomParameter1] = kCustomParameter1Value;
   orig_params.custom_parameters[kCustomParameter2] = kCustomParameter2Value;
 
diff --git a/quic/core/http/end_to_end_test.cc b/quic/core/http/end_to_end_test.cc
index cf84969..cad9cac 100644
--- a/quic/core/http/end_to_end_test.cc
+++ b/quic/core/http/end_to_end_test.cc
@@ -552,12 +552,6 @@
           EXPECT_EQ(0u, server_stats.packets_lost);
         }
         EXPECT_EQ(0u, server_stats.packets_discarded);
-        if (!GetQuicReloadableFlag(
-                quic_ignore_user_agent_transport_parameter)) {
-          EXPECT_EQ(
-              server_session->user_agent_id().value_or("MissingUserAgent"),
-              kTestUserAgentId);
-        }
       } else {
         ADD_FAILURE() << "Missing server connection";
       }
@@ -5902,10 +5896,6 @@
   QuicConfig* server_config = nullptr;
   if (server_session != nullptr) {
     server_config = server_session->config();
-    if (!GetQuicReloadableFlag(quic_ignore_user_agent_transport_parameter)) {
-      EXPECT_EQ(server_session->user_agent_id().value_or("MissingUserAgent"),
-                kTestUserAgentId);
-    }
   } else {
     ADD_FAILURE() << "Missing server session";
   }
diff --git a/quic/core/quic_flags_list.h b/quic/core/quic_flags_list.h
index f61faf8..2039148 100644
--- a/quic/core/quic_flags_list.h
+++ b/quic/core/quic_flags_list.h
@@ -123,8 +123,6 @@
 QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_match_ietf_reset_code, true)
 // When the flag is true, exit STARTUP after the same number of loss events as PROBE_UP.
 QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_bbr2_startup_probe_up_loss_events, true)
-// When true, QUIC server will ignore received user agent transport parameter and rely on getting that information from HTTP headers.
-QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_ignore_user_agent_transport_parameter, true)
 // When true, QUIC will both send and validate the version_information transport parameter.
 QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_version_information, false)
 // When true, defaults to BBR congestion control instead of Cubic.
diff --git a/quic/core/tls_client_handshaker.cc b/quic/core/tls_client_handshaker.cc
index 7950a9d..62f2b4c 100644
--- a/quic/core/tls_client_handshaker.cc
+++ b/quic/core/tls_client_handshaker.cc
@@ -240,9 +240,6 @@
   if (!handshaker_delegate()->FillTransportParameters(&params)) {
     return false;
   }
-  if (!user_agent_id_.empty()) {
-    params.user_agent_id = user_agent_id_;
-  }
 
   // Notify QuicConnectionDebugVisitor.
   session()->connection()->OnTransportParametersSent(params);
diff --git a/quic/core/tls_server_handshaker.cc b/quic/core/tls_server_handshaker.cc
index e94a597..a16e729 100644
--- a/quic/core/tls_server_handshaker.cc
+++ b/quic/core/tls_server_handshaker.cc
@@ -502,10 +502,6 @@
   }
 
   ProcessAdditionalTransportParameters(client_params);
-  if (!session()->user_agent_id().has_value() &&
-      client_params.user_agent_id.has_value()) {
-    session()->SetUserAgentId(client_params.user_agent_id.value());
-  }
 
   return true;
 }