Extend WebTransport error code space to 32-bit. This is backwards-compatible (the receiver always has to handle error codes outside of WebTransport range anyways), meaning we do not need to gate this via version negotiation. PiperOrigin-RevId: 531176993
diff --git a/quiche/quic/core/http/end_to_end_test.cc b/quiche/quic/core/http/end_to_end_test.cc index 1662a69..fd71300 100644 --- a/quiche/quic/core/http/end_to_end_test.cc +++ b/quiche/quic/core/http/end_to_end_test.cc
@@ -6964,12 +6964,12 @@ QuicStreamId id2 = stream->GetStreamId(); ASSERT_TRUE(stream != nullptr); QUICHE_EXPECT_OK(quiche::WriteIntoStream(*stream, "test")); - stream->SendStopSending(24); + stream->SendStopSending(100024); std::array<std::string, 2> expected_log = { absl::StrCat("Received reset for stream ", id1, " with error code 42"), absl::StrCat("Received stop sending for stream ", id2, - " with error code 24"), + " with error code 100024"), }; client_->WaitUntil(2000, [this, &expected_log]() { return received_webtransport_unidirectional_streams_.size() >=
diff --git a/quiche/quic/core/http/web_transport_http3.cc b/quiche/quic/core/http/web_transport_http3.cc index 7a5fd07..f1c922b 100644 --- a/quiche/quic/core/http/web_transport_http3.cc +++ b/quiche/quic/core/http/web_transport_http3.cc
@@ -436,7 +436,7 @@ namespace { constexpr uint64_t kWebTransportMappedErrorCodeFirst = 0x52e4a40fa8db; -constexpr uint64_t kWebTransportMappedErrorCodeLast = 0x52e4a40fa9e2; +constexpr uint64_t kWebTransportMappedErrorCodeLast = 0x52e5ac983162; constexpr WebTransportStreamError kDefaultWebTransportError = 0; } // namespace @@ -454,7 +454,8 @@ uint64_t shifted = http3_error_code - kWebTransportMappedErrorCodeFirst; uint64_t result = shifted - shifted / 0x1f; - QUICHE_DCHECK_LE(result, std::numeric_limits<uint8_t>::max()); + QUICHE_DCHECK_LE(result, + std::numeric_limits<webtransport::StreamErrorCode>::max()); return static_cast<WebTransportStreamError>(result); }
diff --git a/quiche/quic/core/http/web_transport_http3_test.cc b/quiche/quic/core/http/web_transport_http3_test.cc index 87cd0d3..be8cfdd 100644 --- a/quiche/quic/core/http/web_transport_http3_test.cc +++ b/quiche/quic/core/http/web_transport_http3_test.cc
@@ -18,6 +18,7 @@ TEST(WebTransportHttp3Test, ErrorCodesToHttp3) { EXPECT_EQ(0x52e4a40fa8dbu, WebTransportErrorToHttp3(0x00)); EXPECT_EQ(0x52e4a40fa9e2u, WebTransportErrorToHttp3(0xff)); + EXPECT_EQ(0x52e5ac983162u, WebTransportErrorToHttp3(0xffffffff)); EXPECT_EQ(0x52e4a40fa8f7u, WebTransportErrorToHttp3(0x1c)); EXPECT_EQ(0x52e4a40fa8f8u, WebTransportErrorToHttp3(0x1d)); @@ -28,6 +29,7 @@ TEST(WebTransportHttp3Test, ErrorCodesToWebTransport) { EXPECT_THAT(Http3ErrorToWebTransport(0x52e4a40fa8db), Optional(0x00)); EXPECT_THAT(Http3ErrorToWebTransport(0x52e4a40fa9e2), Optional(0xff)); + EXPECT_THAT(Http3ErrorToWebTransport(0x52e5ac983162u), Optional(0xffffffff)); EXPECT_THAT(Http3ErrorToWebTransport(0x52e4a40fa8f7), Optional(0x1cu)); EXPECT_THAT(Http3ErrorToWebTransport(0x52e4a40fa8f8), Optional(0x1du)); @@ -40,11 +42,18 @@ } TEST(WebTransportHttp3Test, ErrorCodeRoundTrip) { - for (int error = 0; error < 256; error++) { + for (int error = 0; error <= 65536; error++) { uint64_t http_error = WebTransportErrorToHttp3(error); absl::optional<WebTransportStreamError> mapped_back = quic::Http3ErrorToWebTransport(http_error); - EXPECT_THAT(mapped_back, Optional(error)); + ASSERT_THAT(mapped_back, Optional(error)); + } + for (int64_t error = 0; error < std::numeric_limits<uint32_t>::max(); + error += 65537) { + uint64_t http_error = WebTransportErrorToHttp3(error); + absl::optional<WebTransportStreamError> mapped_back = + quic::Http3ErrorToWebTransport(http_error); + ASSERT_THAT(mapped_back, Optional(error)); } }
diff --git a/quiche/quic/core/quic_types.h b/quiche/quic/core/quic_types.h index b2a100b..961e904 100644 --- a/quiche/quic/core/quic_types.h +++ b/quiche/quic/core/quic_types.h
@@ -23,6 +23,7 @@ #include "quiche/quic/platform/api/quic_export.h" #include "quiche/quic/platform/api/quic_flags.h" #include "quiche/common/quiche_endian.h" +#include "quiche/web_transport/web_transport.h" namespace quic { @@ -52,10 +53,10 @@ // WebTransport session IDs are stream IDs. using WebTransportSessionId = uint64_t; -// WebTransport stream reset codes are 8-bit. -using WebTransportStreamError = uint8_t; +// WebTransport stream reset codes are 32-bit. +using WebTransportStreamError = ::webtransport::StreamErrorCode; // WebTransport session error codes are 32-bit. -using WebTransportSessionError = uint32_t; +using WebTransportSessionError = ::webtransport::SessionErrorCode; enum : size_t { kQuicPathFrameBufferSize = 8 }; using QuicPathFrameBuffer = std::array<uint8_t, kQuicPathFrameBufferSize>;
diff --git a/quiche/web_transport/web_transport.h b/quiche/web_transport/web_transport.h index 7ea0085..70bb36f 100644 --- a/quiche/web_transport/web_transport.h +++ b/quiche/web_transport/web_transport.h
@@ -30,7 +30,7 @@ using StreamId = uint32_t; // Application-specific error code used for resetting either the read or the // write half of the stream. -using StreamErrorCode = uint8_t; +using StreamErrorCode = uint32_t; // Application-specific error code used for closing a WebTransport session. using SessionErrorCode = uint32_t;