Track the source of QUIC stream priority values in a new PrioritySource enum. PiperOrigin-RevId: 961031823
diff --git a/quiche/quic/core/http/quic_spdy_session.cc b/quiche/quic/core/http/quic_spdy_session.cc index 810c77e..a74ce79 100644 --- a/quiche/quic/core/http/quic_spdy_session.cc +++ b/quiche/quic/core/http/quic_spdy_session.cc
@@ -28,6 +28,7 @@ #include "quiche/quic/core/http/web_transport_http3.h" #include "quiche/quic/core/quic_error_codes.h" #include "quiche/quic/core/quic_session.h" +#include "quiche/quic/core/quic_stream_priority.h" #include "quiche/quic/core/quic_types.h" #include "quiche/quic/core/quic_utils.h" #include "quiche/quic/core/quic_versions.h" @@ -735,6 +736,9 @@ bool QuicSpdySession::OnPriorityUpdateForRequestStream( QuicStreamId stream_id, HttpStreamPriority priority) { + // TODO: Close the connection if the client receives a PRIORITY_UPDATE or + // the stream is not a request stream, per + // https://datatracker.ietf.org/doc/html/rfc9218#section-7.2 if (perspective() == Perspective::IS_CLIENT || !QuicUtils::IsBidirectionalStreamId(stream_id, version()) || !QuicUtils::IsClientInitiatedStreamId(transport_version(), stream_id)) { @@ -964,6 +968,7 @@ } stream->SetPriority(QuicStreamPriority(it->second)); + stream->set_priority_source(quic::PrioritySource::SET_BY_PRIORITY_UPDATE); buffered_stream_priorities_.erase(it); }
diff --git a/quiche/quic/core/http/quic_spdy_session_test.cc b/quiche/quic/core/http/quic_spdy_session_test.cc index 286cff2..a1e8107 100644 --- a/quiche/quic/core/http/quic_spdy_session_test.cc +++ b/quiche/quic/core/http/quic_spdy_session_test.cc
@@ -2368,11 +2368,14 @@ HttpStreamPriority{HttpStreamPriority::kDefaultUrgency, HttpStreamPriority::kDefaultIncremental}), stream1->priority()); + EXPECT_EQ(quic::PrioritySource::NOT_SET, stream1->priority_source()); EXPECT_CALL(debug_visitor, OnPriorityUpdateFrameReceived(priority_update1)); session_->OnStreamFrame(data3); EXPECT_EQ(QuicStreamPriority(HttpStreamPriority{ 2u, HttpStreamPriority::kDefaultIncremental}), stream1->priority()); + EXPECT_EQ(quic::PrioritySource::SET_BY_PRIORITY_UPDATE, + stream1->priority_source()); // PRIORITY_UPDATE frame for second request stream. const QuicStreamId stream_id2 = GetNthClientInitiatedBidirectionalId(1); @@ -2391,6 +2394,8 @@ TestStream* stream2 = session_->CreateIncomingStream(stream_id2); EXPECT_EQ(QuicStreamPriority(HttpStreamPriority{5u, true}), stream2->priority()); + EXPECT_EQ(quic::PrioritySource::SET_BY_PRIORITY_UPDATE, + stream2->priority_source()); } TEST_P(QuicSpdySessionTestServer, OnInvalidPriorityUpdateFrame) {
diff --git a/quiche/quic/core/quic_session.cc b/quiche/quic/core/quic_session.cc index 9d6d245..5116dc7 100644 --- a/quiche/quic/core/quic_session.cc +++ b/quiche/quic/core/quic_session.cc
@@ -2369,6 +2369,8 @@ auto active_stream = stream_map_.find(stream_id); if (active_stream != stream_map_.end()) { active_stream->second->SetPriority(priority); + active_stream->second->set_priority_source( + quic::PrioritySource::SET_BY_PRIORITY_UPDATE); return true; }
diff --git a/quiche/quic/core/quic_stream.h b/quiche/quic/core/quic_stream.h index c45d40f..517b551 100644 --- a/quiche/quic/core/quic_stream.h +++ b/quiche/quic/core/quic_stream.h
@@ -233,6 +233,11 @@ const QuicStreamPriority& priority() const; + PrioritySource priority_source() const { return priority_source_; } + void set_priority_source(PrioritySource priority_source) { + priority_source_ = priority_source; + } + // Send PRIORITY_UPDATE frame if application protocol supports it. virtual void MaybeSendPriorityUpdateFrame() {} @@ -585,6 +590,8 @@ StreamDelegateInterface* stream_delegate_; // The priority of the stream, once parsed. QuicStreamPriority priority_; + // Source of the stream priority value. + PrioritySource priority_source_ = PrioritySource::NOT_SET; // Bytes read refers to payload bytes only: they do not include framing, // encryption overhead etc. uint64_t stream_bytes_read_;
diff --git a/quiche/quic/core/quic_stream_priority.h b/quiche/quic/core/quic_stream_priority.h index 40817b6..9f5728d 100644 --- a/quiche/quic/core/quic_stream_priority.h +++ b/quiche/quic/core/quic_stream_priority.h
@@ -19,6 +19,14 @@ namespace quic { +// Source of the stream priority value. +enum class PrioritySource : uint8_t { + NOT_SET, + SET_BY_PRIORITY_UPDATE, + SET_BY_REQUEST_HEADER, + SET_BY_RESPONSE_HEADER, +}; + // Represents HTTP priorities as defined by RFC 9218. struct QUICHE_EXPORT HttpStreamPriority { static constexpr int kMinimumUrgency = 0;