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