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;