Remove datagram context registration

This feature was removed in draft-ietf-masque-h3-datagram-06 so we're removing it from the codebase. To allow backwards compatibility with WebTransport servers that run draft-ietf-masque-h3-datagram-04 or -05, we're hand-crafting a registration capsule and sending it in that scenario. This CL is a no-op since we will send the exact same capsule. It is not flag protected because there is currently no use of HTTP Datagrams on our prod servers.

PiperOrigin-RevId: 442027763
diff --git a/quiche/quic/core/http/capsule.cc b/quiche/quic/core/http/capsule.cc
index a5aa4f2..ebebbe2 100644
--- a/quiche/quic/core/http/capsule.cc
+++ b/quiche/quic/core/http/capsule.cc
@@ -24,8 +24,6 @@
       return "LEGACY_DATAGRAM";
     case CapsuleType::DATAGRAM_WITHOUT_CONTEXT:
       return "DATAGRAM_WITHOUT_CONTEXT";
-    case CapsuleType::REGISTER_DATAGRAM_NO_CONTEXT:
-      return "REGISTER_DATAGRAM_NO_CONTEXT";
     case CapsuleType::CLOSE_WEBTRANSPORT_SESSION:
       return "CLOSE_WEBTRANSPORT_SESSION";
   }
@@ -37,24 +35,6 @@
   return os;
 }
 
-std::string DatagramFormatTypeToString(
-    DatagramFormatType datagram_format_type) {
-  switch (datagram_format_type) {
-    case DatagramFormatType::UDP_PAYLOAD:
-      return "UDP_PAYLOAD";
-    case DatagramFormatType::WEBTRANSPORT:
-      return "WEBTRANSPORT";
-  }
-  return absl::StrCat("Unknown(", static_cast<uint64_t>(datagram_format_type),
-                      ")");
-}
-
-std::ostream& operator<<(std::ostream& os,
-                         const DatagramFormatType& datagram_format_type) {
-  os << DatagramFormatTypeToString(datagram_format_type);
-  return os;
-}
-
 Capsule::Capsule(CapsuleType capsule_type) : capsule_type_(capsule_type) {
   switch (capsule_type) {
     case CapsuleType::LEGACY_DATAGRAM:
@@ -72,15 +52,6 @@
           "All capsule structs must have these properties");
       datagram_without_context_capsule_ = DatagramWithoutContextCapsule();
       break;
-    case CapsuleType::REGISTER_DATAGRAM_NO_CONTEXT:
-      static_assert(
-          std::is_standard_layout<RegisterDatagramNoContextCapsule>::value &&
-              std::is_trivially_destructible<
-                  RegisterDatagramNoContextCapsule>::value,
-          "All capsule structs must have these properties");
-      register_datagram_no_context_capsule_ =
-          RegisterDatagramNoContextCapsule();
-      break;
     case CapsuleType::CLOSE_WEBTRANSPORT_SESSION:
       static_assert(
           std::is_standard_layout<CloseWebTransportSessionCapsule>::value &&
@@ -116,16 +87,6 @@
 }
 
 // static
-Capsule Capsule::RegisterDatagramNoContext(
-    DatagramFormatType format_type, absl::string_view format_additional_data) {
-  Capsule capsule(CapsuleType::REGISTER_DATAGRAM_NO_CONTEXT);
-  capsule.register_datagram_no_context_capsule().format_type = format_type;
-  capsule.register_datagram_no_context_capsule().format_additional_data =
-      format_additional_data;
-  return capsule;
-}
-
-// static
 Capsule Capsule::CloseWebTransportSession(WebTransportSessionError error_code,
                                           absl::string_view error_message) {
   Capsule capsule(CapsuleType::CLOSE_WEBTRANSPORT_SESSION);
@@ -152,10 +113,6 @@
       datagram_without_context_capsule_ =
           other.datagram_without_context_capsule_;
       break;
-    case CapsuleType::REGISTER_DATAGRAM_NO_CONTEXT:
-      register_datagram_no_context_capsule_ =
-          other.register_datagram_no_context_capsule_;
-      break;
     case CapsuleType::CLOSE_WEBTRANSPORT_SESSION:
       close_web_transport_session_capsule_ =
           other.close_web_transport_session_capsule_;
@@ -184,12 +141,6 @@
     case CapsuleType::DATAGRAM_WITHOUT_CONTEXT:
       return datagram_without_context_capsule_.http_datagram_payload ==
              other.datagram_without_context_capsule_.http_datagram_payload;
-    case CapsuleType::REGISTER_DATAGRAM_NO_CONTEXT:
-      return register_datagram_no_context_capsule_.format_type ==
-                 other.register_datagram_no_context_capsule_.format_type &&
-             register_datagram_no_context_capsule_.format_additional_data ==
-                 other.register_datagram_no_context_capsule_
-                     .format_additional_data;
     case CapsuleType::CLOSE_WEBTRANSPORT_SESSION:
       return close_web_transport_session_capsule_.error_code ==
                  other.close_web_transport_session_capsule_.error_code &&
@@ -220,16 +171,6 @@
               datagram_without_context_capsule_.http_datagram_payload),
           "]");
       break;
-    case CapsuleType::REGISTER_DATAGRAM_NO_CONTEXT:
-      absl::StrAppend(
-          &rv, "(format_type=",
-          DatagramFormatTypeToString(
-              register_datagram_no_context_capsule_.format_type),
-          "){",
-          absl::BytesToHexString(
-              register_datagram_no_context_capsule_.format_additional_data),
-          "}");
-      break;
     case CapsuleType::CLOSE_WEBTRANSPORT_SESSION:
       absl::StrAppend(
           &rv, "(error_code=", close_web_transport_session_capsule_.error_code,
@@ -271,13 +212,6 @@
       capsule_data_length = capsule.datagram_without_context_capsule()
                                 .http_datagram_payload.length();
       break;
-    case CapsuleType::REGISTER_DATAGRAM_NO_CONTEXT:
-      capsule_data_length =
-          QuicDataWriter::GetVarInt62Len(static_cast<uint64_t>(
-              capsule.register_datagram_no_context_capsule().format_type)) +
-          capsule.register_datagram_no_context_capsule()
-              .format_additional_data.length();
-      break;
     case CapsuleType::CLOSE_WEBTRANSPORT_SESSION:
       capsule_data_length =
           sizeof(WebTransportSessionError) +
@@ -326,23 +260,6 @@
         return {};
       }
       break;
-    case CapsuleType::REGISTER_DATAGRAM_NO_CONTEXT:
-      if (!writer.WriteVarInt62(static_cast<uint64_t>(
-              capsule.register_datagram_no_context_capsule().format_type))) {
-        QUIC_BUG(register no context capsule format type write fail)
-            << "Failed to write REGISTER_DATAGRAM_NO_CONTEXT CAPSULE format "
-               "type";
-        return {};
-      }
-      if (!writer.WriteStringPiece(
-              capsule.register_datagram_no_context_capsule()
-                  .format_additional_data)) {
-        QUIC_BUG(register no context capsule additional data write fail)
-            << "Failed to write REGISTER_DATAGRAM_NO_CONTEXT CAPSULE "
-               "additional data";
-        return {};
-      }
-      break;
     case CapsuleType::CLOSE_WEBTRANSPORT_SESSION:
       if (!writer.WriteUInt32(
               capsule.close_web_transport_session_capsule().error_code)) {
@@ -427,16 +344,6 @@
       capsule.datagram_without_context_capsule().http_datagram_payload =
           capsule_data_reader.ReadRemainingPayload();
       break;
-    case CapsuleType::REGISTER_DATAGRAM_NO_CONTEXT:
-      if (!capsule_data_reader.ReadVarInt62(reinterpret_cast<uint64_t*>(
-              &capsule.register_datagram_no_context_capsule().format_type))) {
-        ReportParseFailure(
-            "Unable to parse capsule REGISTER_DATAGRAM_NO_CONTEXT format type");
-        return 0;
-      }
-      capsule.register_datagram_no_context_capsule().format_additional_data =
-          capsule_data_reader.ReadRemainingPayload();
-      break;
     case CapsuleType::CLOSE_WEBTRANSPORT_SESSION:
       if (!capsule_data_reader.ReadUInt32(
               &capsule.close_web_transport_session_capsule().error_code)) {
diff --git a/quiche/quic/core/http/capsule.h b/quiche/quic/core/http/capsule.h
index 5eec5d7..7f99b70 100644
--- a/quiche/quic/core/http/capsule.h
+++ b/quiche/quic/core/http/capsule.h
@@ -21,8 +21,6 @@
 enum class CapsuleType : uint64_t {
   // Casing in this enum matches the IETF specification.
   LEGACY_DATAGRAM = 0xff37a0,  // draft-ietf-masque-h3-datagram-04.
-  REGISTER_DATAGRAM_NO_CONTEXT =
-      0xff37a2,  // draft-ietf-masque-h3-datagram-04 to -05.
   DATAGRAM_WITHOUT_CONTEXT =
       0xff37a5,  // draft-ietf-masque-h3-datagram-05 to -08.
   CLOSE_WEBTRANSPORT_SESSION = 0x2843,
@@ -32,17 +30,6 @@
 QUIC_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os,
                                              const CapsuleType& capsule_type);
 
-enum class DatagramFormatType : uint64_t {
-  // Casing in this enum matches the IETF specification.
-  UDP_PAYLOAD = 0xff6f00,
-  WEBTRANSPORT = 0xff7c00,
-};
-
-QUIC_EXPORT_PRIVATE std::string DatagramFormatTypeToString(
-    DatagramFormatType datagram_format_type);
-QUIC_EXPORT_PRIVATE std::ostream& operator<<(
-    std::ostream& os, const DatagramFormatType& datagram_format_type);
-
 struct QUIC_EXPORT_PRIVATE LegacyDatagramCapsule {
   absl::optional<QuicDatagramContextId> context_id;
   absl::string_view http_datagram_payload;
@@ -50,10 +37,6 @@
 struct QUIC_EXPORT_PRIVATE DatagramWithoutContextCapsule {
   absl::string_view http_datagram_payload;
 };
-struct QUIC_EXPORT_PRIVATE RegisterDatagramNoContextCapsule {
-  DatagramFormatType format_type;
-  absl::string_view format_additional_data;
-};
 struct QUIC_EXPORT_PRIVATE CloseWebTransportSessionCapsule {
   WebTransportSessionError error_code;
   absl::string_view error_message;
@@ -71,9 +54,6 @@
       absl::string_view http_datagram_payload = absl::string_view());
   static Capsule DatagramWithoutContext(
       absl::string_view http_datagram_payload = absl::string_view());
-  static Capsule RegisterDatagramNoContext(
-      DatagramFormatType format_type,
-      absl::string_view format_additional_data = absl::string_view());
   static Capsule CloseWebTransportSession(
       WebTransportSessionError error_code = 0,
       absl::string_view error_message = "");
@@ -109,15 +89,6 @@
     QUICHE_DCHECK_EQ(capsule_type_, CapsuleType::DATAGRAM_WITHOUT_CONTEXT);
     return datagram_without_context_capsule_;
   }
-  RegisterDatagramNoContextCapsule& register_datagram_no_context_capsule() {
-    QUICHE_DCHECK_EQ(capsule_type_, CapsuleType::REGISTER_DATAGRAM_NO_CONTEXT);
-    return register_datagram_no_context_capsule_;
-  }
-  const RegisterDatagramNoContextCapsule& register_datagram_no_context_capsule()
-      const {
-    QUICHE_DCHECK_EQ(capsule_type_, CapsuleType::REGISTER_DATAGRAM_NO_CONTEXT);
-    return register_datagram_no_context_capsule_;
-  }
   CloseWebTransportSessionCapsule& close_web_transport_session_capsule() {
     QUICHE_DCHECK_EQ(capsule_type_, CapsuleType::CLOSE_WEBTRANSPORT_SESSION);
     return close_web_transport_session_capsule_;
@@ -130,7 +101,6 @@
   absl::string_view& unknown_capsule_data() {
     QUICHE_DCHECK(capsule_type_ != CapsuleType::LEGACY_DATAGRAM &&
                   capsule_type_ != CapsuleType::DATAGRAM_WITHOUT_CONTEXT &&
-                  capsule_type_ != CapsuleType::REGISTER_DATAGRAM_NO_CONTEXT &&
                   capsule_type_ != CapsuleType::CLOSE_WEBTRANSPORT_SESSION)
         << capsule_type_;
     return unknown_capsule_data_;
@@ -138,7 +108,6 @@
   const absl::string_view& unknown_capsule_data() const {
     QUICHE_DCHECK(capsule_type_ != CapsuleType::LEGACY_DATAGRAM &&
                   capsule_type_ != CapsuleType::DATAGRAM_WITHOUT_CONTEXT &&
-                  capsule_type_ != CapsuleType::REGISTER_DATAGRAM_NO_CONTEXT &&
                   capsule_type_ != CapsuleType::CLOSE_WEBTRANSPORT_SESSION)
         << capsule_type_;
     return unknown_capsule_data_;
@@ -149,7 +118,6 @@
   union {
     LegacyDatagramCapsule legacy_datagram_capsule_;
     DatagramWithoutContextCapsule datagram_without_context_capsule_;
-    RegisterDatagramNoContextCapsule register_datagram_no_context_capsule_;
     CloseWebTransportSessionCapsule close_web_transport_session_capsule_;
     absl::string_view unknown_capsule_data_;
   };
diff --git a/quiche/quic/core/http/capsule_test.cc b/quiche/quic/core/http/capsule_test.cc
index d1f1792a..4dd220e 100644
--- a/quiche/quic/core/http/capsule_test.cc
+++ b/quiche/quic/core/http/capsule_test.cc
@@ -31,9 +31,6 @@
 
 namespace {
 
-constexpr DatagramFormatType kFakeFormatType =
-    static_cast<DatagramFormatType>(0x123456);
-
 class MockCapsuleParserVisitor : public CapsuleParser::Visitor {
  public:
   MockCapsuleParserVisitor() {
@@ -103,25 +100,6 @@
   TestSerialization(expected_capsule, capsule_fragment);
 }
 
-TEST_F(CapsuleTest, RegisterNoContextCapsule) {
-  std::string capsule_fragment = absl::HexStringToBytes(
-      "80ff37a2"          // REGISTER_DATAGRAM_NO_CONTEXT capsule type
-      "0c"                // capsule length
-      "80123456"          // 0x123456 datagram format type
-      "f1f2f3f4f5f6f7f8"  // format additional data
-  );
-  std::string format_additional_data =
-      absl::HexStringToBytes("f1f2f3f4f5f6f7f8");
-  Capsule expected_capsule = Capsule::RegisterDatagramNoContext(
-      kFakeFormatType, format_additional_data);
-  {
-    EXPECT_CALL(visitor_, OnCapsule(expected_capsule));
-    ASSERT_TRUE(capsule_parser_.IngestCapsuleFragment(capsule_fragment));
-  }
-  ValidateParserIsEmpty();
-  TestSerialization(expected_capsule, capsule_fragment);
-}
-
 TEST_F(CapsuleTest, CloseWebTransportStreamCapsule) {
   std::string capsule_fragment = absl::HexStringToBytes(
       "6843"        // CLOSE_WEBTRANSPORT_STREAM capsule type
diff --git a/quiche/quic/core/http/quic_spdy_session_test.cc b/quiche/quic/core/http/quic_spdy_session_test.cc
index b5e895a..e26432a 100644
--- a/quiche/quic/core/http/quic_spdy_session_test.cc
+++ b/quiche/quic/core/http/quic_spdy_session_test.cc
@@ -593,10 +593,6 @@
       headers.OnHeader("sec-webtransport-http3-draft02", "1");
     }
     stream->OnStreamHeaderList(/*fin=*/true, 0, headers);
-    if (session_.http_datagram_support() != HttpDatagramSupport::kDraft00) {
-      stream->OnCapsule(
-          Capsule::RegisterDatagramNoContext(DatagramFormatType::WEBTRANSPORT));
-    }
     WebTransportHttp3* web_transport =
         session_.GetWebTransportSession(session_id);
     ASSERT_TRUE(web_transport != nullptr);
diff --git a/quiche/quic/core/http/quic_spdy_stream.cc b/quiche/quic/core/http/quic_spdy_stream.cc
index db8b178..991631c 100644
--- a/quiche/quic/core/http/quic_spdy_stream.cc
+++ b/quiche/quic/core/http/quic_spdy_stream.cc
@@ -304,9 +304,14 @@
           HttpDatagramSupport::kDraft04) {
         // Send a REGISTER_DATAGRAM_NO_CONTEXT capsule to support servers that
         // are running draft-ietf-masque-h3-datagram-04 or -05.
-        WriteCapsule(Capsule::RegisterDatagramNoContext(
-            DatagramFormatType::WEBTRANSPORT,
-            /*format_additional_data=*/absl::string_view()));
+        uint64_t capsule_type = 0xff37a2;  // REGISTER_DATAGRAM_NO_CONTEXT
+        constexpr unsigned char capsule_data[4] = {
+            0x80, 0xff, 0x7c, 0x00,  // WEBTRANSPORT datagram format type
+        };
+        WriteCapsule(Capsule::Unknown(
+            capsule_type,
+            absl::string_view(reinterpret_cast<const char*>(capsule_data),
+                              sizeof(capsule_data))));
         WriteGreaseCapsule();
       }
     }
@@ -1442,9 +1447,6 @@
       HandleReceivedDatagram(
           capsule.datagram_without_context_capsule().http_datagram_payload);
     } break;
-    case CapsuleType::REGISTER_DATAGRAM_NO_CONTEXT: {
-      // Silently ignore received REGISTER_DATAGRAM_NO_CONTEXT capsules.
-    } break;
     case CapsuleType::CLOSE_WEBTRANSPORT_SESSION: {
       if (web_transport_ == nullptr) {
         QUIC_DLOG(ERROR) << ENDPOINT << "Received capsule " << capsule