Allow QuicStreamPriority hold different types of priority.
The two types introduced in this CL are HttpStreamPriority and WebTransportStreamPriority.
PiperOrigin-RevId: 517979331
diff --git a/quiche/quic/core/http/quic_receive_control_stream.cc b/quiche/quic/core/http/quic_receive_control_stream.cc
index c3862be..4be1536 100644
--- a/quiche/quic/core/http/quic_receive_control_stream.cc
+++ b/quiche/quic/core/http/quic_receive_control_stream.cc
@@ -137,7 +137,7 @@
spdy_session()->debug_visitor()->OnPriorityUpdateFrameReceived(frame);
}
- absl::optional<QuicStreamPriority> priority =
+ absl::optional<HttpStreamPriority> priority =
ParsePriorityFieldValue(frame.priority_field_value);
if (!priority.has_value()) {
diff --git a/quiche/quic/core/http/quic_send_control_stream.cc b/quiche/quic/core/http/quic_send_control_stream.cc
index d3c2ef2..e9b06ed 100644
--- a/quiche/quic/core/http/quic_send_control_stream.cc
+++ b/quiche/quic/core/http/quic_send_control_stream.cc
@@ -86,7 +86,7 @@
}
void QuicSendControlStream::WritePriorityUpdate(QuicStreamId stream_id,
- QuicStreamPriority priority) {
+ HttpStreamPriority priority) {
QuicConnection::ScopedPacketFlusher flusher(session()->connection());
MaybeSendSettingsFrame();
diff --git a/quiche/quic/core/http/quic_send_control_stream.h b/quiche/quic/core/http/quic_send_control_stream.h
index 6d0745c..fa8b96a 100644
--- a/quiche/quic/core/http/quic_send_control_stream.h
+++ b/quiche/quic/core/http/quic_send_control_stream.h
@@ -40,7 +40,7 @@
// Send a PRIORITY_UPDATE frame on this stream, and a SETTINGS frame
// beforehand if one has not been already sent.
- void WritePriorityUpdate(QuicStreamId stream_id, QuicStreamPriority priority);
+ void WritePriorityUpdate(QuicStreamId stream_id, HttpStreamPriority priority);
// Send a GOAWAY frame on this stream, and a SETTINGS frame beforehand if one
// has not been already sent.
diff --git a/quiche/quic/core/http/quic_send_control_stream_test.cc b/quiche/quic/core/http/quic_send_control_stream_test.cc
index 20e96c6..cd3a274 100644
--- a/quiche/quic/core/http/quic_send_control_stream_test.cc
+++ b/quiche/quic/core/http/quic_send_control_stream_test.cc
@@ -253,14 +253,14 @@
.Times(4);
send_control_stream_->WritePriorityUpdate(
/* stream_id = */ 0,
- QuicStreamPriority{/* urgency = */ 3, /* incremental = */ false});
+ HttpStreamPriority{/* urgency = */ 3, /* incremental = */ false});
EXPECT_TRUE(testing::Mock::VerifyAndClearExpectations(&session_));
EXPECT_CALL(session_, WritevData(send_control_stream_->id(), _, _, _, _, _));
send_control_stream_->WritePriorityUpdate(
/* stream_id = */ 0,
- QuicStreamPriority{/* urgency = */ 3, /* incremental = */ false});
+ HttpStreamPriority{/* urgency = */ 3, /* incremental = */ false});
}
TEST_P(QuicSendControlStreamTest, CloseControlStream) {
diff --git a/quiche/quic/core/http/quic_server_session_base_test.cc b/quiche/quic/core/http/quic_server_session_base_test.cc
index 807f05f..256abae 100644
--- a/quiche/quic/core/http/quic_server_session_base_test.cc
+++ b/quiche/quic/core/http/quic_server_session_base_test.cc
@@ -545,7 +545,8 @@
if (!VersionUsesHttp3(transport_version())) {
session_->RegisterStreamPriority(
QuicUtils::GetHeadersStreamId(transport_version()),
- /*is_static=*/true, QuicStreamPriority());
+ /*is_static=*/true,
+ QuicStreamPriority::Default(session_->priority_type()));
}
// Set some initial bandwidth values.
diff --git a/quiche/quic/core/http/quic_spdy_session.cc b/quiche/quic/core/http/quic_spdy_session.cc
index c404b70..e024213 100644
--- a/quiche/quic/core/http/quic_spdy_session.cc
+++ b/quiche/quic/core/http/quic_spdy_session.cc
@@ -621,7 +621,7 @@
}
bool QuicSpdySession::OnPriorityUpdateForRequestStream(
- QuicStreamId stream_id, QuicStreamPriority priority) {
+ QuicStreamId stream_id, HttpStreamPriority priority) {
if (perspective() == Perspective::IS_CLIENT ||
!QuicUtils::IsBidirectionalStreamId(stream_id, version()) ||
!QuicUtils::IsClientInitiatedStreamId(transport_version(), stream_id)) {
@@ -642,7 +642,7 @@
return false;
}
- if (MaybeSetStreamPriority(stream_id, priority)) {
+ if (MaybeSetStreamPriority(stream_id, QuicStreamPriority(priority))) {
return true;
}
@@ -706,7 +706,7 @@
}
void QuicSpdySession::WriteHttp3PriorityUpdate(QuicStreamId stream_id,
- QuicStreamPriority priority) {
+ HttpStreamPriority priority) {
QUICHE_DCHECK(VersionUsesHttp3(transport_version()));
send_control_stream_->WritePriorityUpdate(stream_id, priority);
@@ -842,7 +842,7 @@
return;
}
- stream->SetPriority(it->second);
+ stream->SetPriority(QuicStreamPriority(it->second));
buffered_stream_priorities_.erase(it);
}
diff --git a/quiche/quic/core/http/quic_spdy_session.h b/quiche/quic/core/http/quic_spdy_session.h
index 9f4782b..0102787 100644
--- a/quiche/quic/core/http/quic_spdy_session.h
+++ b/quiche/quic/core/http/quic_spdy_session.h
@@ -182,7 +182,7 @@
// Called when an HTTP/3 PRIORITY_UPDATE frame has been received for a request
// stream. Returns false and closes connection if |stream_id| is invalid.
bool OnPriorityUpdateForRequestStream(QuicStreamId stream_id,
- QuicStreamPriority priority);
+ HttpStreamPriority priority);
// Called when an HTTP/3 ACCEPT_CH frame has been received.
// This method will only be called for client sessions.
@@ -216,7 +216,7 @@
// Writes an HTTP/3 PRIORITY_UPDATE frame to the peer.
void WriteHttp3PriorityUpdate(QuicStreamId stream_id,
- QuicStreamPriority priority);
+ HttpStreamPriority priority);
// Process received HTTP/3 GOAWAY frame. When sent from server to client,
// |id| is a stream ID. When sent from client to server, |id| is a push ID.
@@ -629,7 +629,7 @@
// Priority values received in PRIORITY_UPDATE frames for streams that are not
// open yet.
- absl::flat_hash_map<QuicStreamId, QuicStreamPriority>
+ absl::flat_hash_map<QuicStreamId, HttpStreamPriority>
buffered_stream_priorities_;
// An integer used for live check. The indicator is assigned a value in
diff --git a/quiche/quic/core/http/quic_spdy_session_test.cc b/quiche/quic/core/http/quic_spdy_session_test.cc
index 67ed9ea..89ee9e4 100644
--- a/quiche/quic/core/http/quic_spdy_session_test.cc
+++ b/quiche/quic/core/http/quic_spdy_session_test.cc
@@ -2110,8 +2110,8 @@
session_.OnPriorityFrame(stream_id,
spdy::SpdyStreamPrecedence(kV3HighestPriority));
- EXPECT_EQ((QuicStreamPriority{kV3HighestPriority,
- QuicStreamPriority::kDefaultIncremental}),
+ EXPECT_EQ((QuicStreamPriority(HttpStreamPriority{
+ kV3HighestPriority, HttpStreamPriority::kDefaultIncremental})),
stream->priority());
}
@@ -2156,12 +2156,14 @@
// PRIORITY_UPDATE frame arrives after stream creation.
TestStream* stream1 = session_.CreateIncomingStream(stream_id1);
- EXPECT_EQ((QuicStreamPriority{QuicStreamPriority::kDefaultUrgency,
- QuicStreamPriority::kDefaultIncremental}),
+ EXPECT_EQ(QuicStreamPriority(
+ HttpStreamPriority{HttpStreamPriority::kDefaultUrgency,
+ HttpStreamPriority::kDefaultIncremental}),
stream1->priority());
EXPECT_CALL(debug_visitor, OnPriorityUpdateFrameReceived(priority_update1));
session_.OnStreamFrame(data3);
- EXPECT_EQ((QuicStreamPriority{2u, QuicStreamPriority::kDefaultIncremental}),
+ EXPECT_EQ(QuicStreamPriority(HttpStreamPriority{
+ 2u, HttpStreamPriority::kDefaultIncremental}),
stream1->priority());
// PRIORITY_UPDATE frame for second request stream.
@@ -2179,7 +2181,8 @@
session_.OnStreamFrame(stream_frame3);
// Priority is applied upon stream construction.
TestStream* stream2 = session_.CreateIncomingStream(stream_id2);
- EXPECT_EQ((QuicStreamPriority{5u, true}), stream2->priority());
+ EXPECT_EQ(QuicStreamPriority(HttpStreamPriority{5u, true}),
+ stream2->priority());
}
TEST_P(QuicSpdySessionTestServer, OnInvalidPriorityUpdateFrame) {
diff --git a/quiche/quic/core/http/quic_spdy_stream.cc b/quiche/quic/core/http/quic_spdy_stream.cc
index 93546ec..84f57e3 100644
--- a/quiche/quic/core/http/quic_spdy_stream.cc
+++ b/quiche/quic/core/http/quic_spdy_stream.cc
@@ -22,6 +22,7 @@
#include "quiche/quic/core/http/web_transport_http3.h"
#include "quiche/quic/core/qpack/qpack_decoder.h"
#include "quiche/quic/core/qpack/qpack_encoder.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"
@@ -191,7 +192,9 @@
HttpDecoderOptionsForBidiStream(spdy_session)),
sequencer_offset_(0),
is_decoder_processing_input_(false),
- ack_listener_(nullptr) {
+ ack_listener_(nullptr),
+ last_sent_priority_(
+ QuicStreamPriority::Default(spdy_session->priority_type())) {
QUICHE_DCHECK_EQ(session()->connection(), spdy_session->connection());
QUICHE_DCHECK_EQ(transport_version(), spdy_session->transport_version());
QUICHE_DCHECK(!QuicUtils::IsCryptoStreamId(transport_version(), id));
@@ -225,7 +228,9 @@
decoder_(http_decoder_visitor_.get()),
sequencer_offset_(sequencer()->NumBytesConsumed()),
is_decoder_processing_input_(false),
- ack_listener_(nullptr) {
+ ack_listener_(nullptr),
+ last_sent_priority_(
+ QuicStreamPriority::Default(spdy_session->priority_type())) {
QUICHE_DCHECK_EQ(session()->connection(), spdy_session->connection());
QUICHE_DCHECK_EQ(transport_version(), spdy_session->transport_version());
QUICHE_DCHECK(!QuicUtils::IsCryptoStreamId(transport_version(), id()));
@@ -504,8 +509,11 @@
const spdy::SpdyStreamPrecedence& precedence) {
QUICHE_DCHECK_EQ(Perspective::IS_SERVER,
session()->connection()->perspective());
- SetPriority(QuicStreamPriority{precedence.spdy3_priority(),
- QuicStreamPriority::kDefaultIncremental});
+ if (session()->priority_type() != QuicPriorityType::kHttp) {
+ return;
+ }
+ SetPriority(QuicStreamPriority(HttpStreamPriority{
+ precedence.spdy3_priority(), HttpStreamPriority::kDefaultIncremental}));
}
void QuicSpdyStream::OnStreamHeaderList(bool fin, size_t frame_len,
@@ -586,13 +594,16 @@
session()->perspective() != Perspective::IS_CLIENT) {
return;
}
+ if (spdy_session_->priority_type() != QuicPriorityType::kHttp) {
+ return;
+ }
if (last_sent_priority_ == priority()) {
return;
}
last_sent_priority_ = priority();
- spdy_session_->WriteHttp3PriorityUpdate(id(), priority());
+ spdy_session_->WriteHttp3PriorityUpdate(id(), priority().http());
}
void QuicSpdyStream::OnHeadersTooLarge() { Reset(QUIC_HEADERS_TOO_LARGE); }
@@ -704,8 +715,11 @@
const spdy::SpdyStreamPrecedence& precedence) {
QUICHE_DCHECK_EQ(Perspective::IS_SERVER,
session()->connection()->perspective());
- SetPriority(QuicStreamPriority{precedence.spdy3_priority(),
- QuicStreamPriority::kDefaultIncremental});
+ if (session()->priority_type() != QuicPriorityType::kHttp) {
+ return;
+ }
+ SetPriority(QuicStreamPriority(HttpStreamPriority{
+ precedence.spdy3_priority(), HttpStreamPriority::kDefaultIncremental}));
}
void QuicSpdyStream::OnStreamReset(const QuicRstStreamFrame& frame) {
@@ -1151,7 +1165,7 @@
if (!VersionUsesHttp3(transport_version())) {
return spdy_session_->WriteHeadersOnHeadersStream(
id(), std::move(header_block), fin,
- spdy::SpdyStreamPrecedence(priority().urgency),
+ spdy::SpdyStreamPrecedence(priority().http().urgency),
std::move(ack_listener));
}
diff --git a/quiche/quic/core/http/quic_spdy_stream_test.cc b/quiche/quic/core/http/quic_spdy_stream_test.cc
index 90b58df..2b966b2 100644
--- a/quiche/quic/core/http/quic_spdy_stream_test.cc
+++ b/quiche/quic/core/http/quic_spdy_stream_test.cc
@@ -326,18 +326,19 @@
void UpdateStreamPriority(QuicStreamId id,
const QuicStreamPriority& new_priority) override {
EXPECT_EQ(id, expected_stream_->id());
- EXPECT_EQ(expected_priority_, new_priority);
- EXPECT_EQ(expected_priority_, expected_stream_->priority());
+ EXPECT_EQ(expected_priority_, new_priority.http());
+ EXPECT_EQ(QuicStreamPriority(expected_priority_),
+ expected_stream_->priority());
}
void SetExpectedStream(QuicSpdyStream* stream) { expected_stream_ = stream; }
- void SetExpectedPriority(const QuicStreamPriority& priority) {
+ void SetExpectedPriority(const HttpStreamPriority& priority) {
expected_priority_ = priority;
}
private:
QuicSpdyStream* expected_stream_;
- QuicStreamPriority expected_priority_;
+ HttpStreamPriority expected_priority_;
};
class QuicSpdyStreamTest : public QuicTestWithParam<ParsedQuicVersion> {
@@ -1563,22 +1564,22 @@
EXPECT_CALL(*session_, WritevData(send_control_stream->id(), _, _, _, _, _));
PriorityUpdateFrame priority_update1{stream_->id(), "u=0"};
EXPECT_CALL(debug_visitor, OnPriorityUpdateFrameSent(priority_update1));
- const QuicStreamPriority priority1{kV3HighestPriority,
- QuicStreamPriority::kDefaultIncremental};
- stream_->SetPriority(priority1);
+ const HttpStreamPriority priority1{kV3HighestPriority,
+ HttpStreamPriority::kDefaultIncremental};
+ stream_->SetPriority(QuicStreamPriority(priority1));
testing::Mock::VerifyAndClearExpectations(&debug_visitor);
// Send another PRIORITY_UPDATE frame with incremental flag set to true.
EXPECT_CALL(*session_, WritevData(send_control_stream->id(), _, _, _, _, _));
PriorityUpdateFrame priority_update2{stream_->id(), "u=2, i"};
EXPECT_CALL(debug_visitor, OnPriorityUpdateFrameSent(priority_update2));
- const QuicStreamPriority priority2{2, true};
- stream_->SetPriority(priority2);
+ const HttpStreamPriority priority2{2, true};
+ stream_->SetPriority(QuicStreamPriority(priority2));
testing::Mock::VerifyAndClearExpectations(&debug_visitor);
// Calling SetPriority() with the same priority does not trigger sending
// another PRIORITY_UPDATE frame.
- stream_->SetPriority(priority2);
+ stream_->SetPriority(QuicStreamPriority(priority2));
}
TEST_P(QuicSpdyStreamTest, ChangePriorityBeforeWritingHeaders) {
@@ -1594,8 +1595,8 @@
QuicSpdySessionPeer::GetSendControlStream(session_.get());
EXPECT_CALL(*session_, WritevData(send_control_stream->id(), _, _, _, _, _));
- stream_->SetPriority(QuicStreamPriority{
- kV3HighestPriority, QuicStreamPriority::kDefaultIncremental});
+ stream_->SetPriority(QuicStreamPriority(HttpStreamPriority{
+ kV3HighestPriority, HttpStreamPriority::kDefaultIncremental}));
testing::Mock::VerifyAndClearExpectations(session_.get());
// Two writes on the request stream: HEADERS frame header and payload.
@@ -1796,8 +1797,8 @@
TEST_P(QuicSpdyStreamTest, OnPriorityFrame) {
Initialize(kShouldProcessData);
stream_->OnPriorityFrame(spdy::SpdyStreamPrecedence(kV3HighestPriority));
- EXPECT_EQ((QuicStreamPriority{kV3HighestPriority,
- QuicStreamPriority::kDefaultIncremental}),
+ EXPECT_EQ(QuicStreamPriority(HttpStreamPriority{
+ kV3HighestPriority, HttpStreamPriority::kDefaultIncremental}),
stream_->priority());
}
@@ -1811,8 +1812,8 @@
EXPECT_CALL(*session_, WritevData(_, 4, _, FIN, _, _));
stream_->WriteOrBufferBody("data", true);
stream_->OnPriorityFrame(spdy::SpdyStreamPrecedence(kV3HighestPriority));
- EXPECT_EQ((QuicStreamPriority{kV3HighestPriority,
- QuicStreamPriority::kDefaultIncremental}),
+ EXPECT_EQ(QuicStreamPriority(HttpStreamPriority{
+ kV3HighestPriority, HttpStreamPriority::kDefaultIncremental}),
stream_->priority());
}
@@ -1834,11 +1835,13 @@
// if called within UpdateStreamPriority(). This expectation is enforced in
// TestMockUpdateStreamSession::UpdateStreamPriority().
session->SetExpectedStream(stream);
- session->SetExpectedPriority(QuicStreamPriority{kV3HighestPriority});
- stream->SetPriority(QuicStreamPriority{kV3HighestPriority});
+ session->SetExpectedPriority(HttpStreamPriority{kV3HighestPriority});
+ stream->SetPriority(
+ QuicStreamPriority(HttpStreamPriority{kV3HighestPriority}));
- session->SetExpectedPriority(QuicStreamPriority{kV3LowestPriority});
- stream->SetPriority(QuicStreamPriority{kV3LowestPriority});
+ session->SetExpectedPriority(HttpStreamPriority{kV3LowestPriority});
+ stream->SetPriority(
+ QuicStreamPriority(HttpStreamPriority{kV3LowestPriority}));
}
TEST_P(QuicSpdyStreamTest, StreamWaitsForAcks) {
diff --git a/quiche/quic/core/quic_session.h b/quiche/quic/core/quic_session.h
index e12bb8f..e1c1932 100644
--- a/quiche/quic/core/quic_session.h
+++ b/quiche/quic/core/quic_session.h
@@ -656,6 +656,9 @@
// streams.
QuicStream* GetActiveStream(QuicStreamId id) const;
+ // Returns the priority type used by the streams in the session.
+ QuicPriorityType priority_type() const { return QuicPriorityType::kHttp; }
+
protected:
using StreamMap =
absl::flat_hash_map<QuicStreamId, std::unique_ptr<QuicStream>>;
@@ -723,7 +726,9 @@
virtual bool ShouldProcessPendingStreamImmediately() const { return true; }
spdy::SpdyPriority GetSpdyPriorityofStream(QuicStreamId stream_id) const {
- return write_blocked_streams_->GetPriorityOfStream(stream_id).urgency;
+ return write_blocked_streams_->GetPriorityOfStream(stream_id)
+ .http()
+ .urgency;
}
size_t pending_streams_size() const { return pending_stream_map_.size(); }
diff --git a/quiche/quic/core/quic_session_test.cc b/quiche/quic/core/quic_session_test.cc
index 750ffac..c8f5f5b 100644
--- a/quiche/quic/core/quic_session_test.cc
+++ b/quiche/quic/core/quic_session_test.cc
@@ -1030,8 +1030,9 @@
TestStream* stream4 = session_.CreateOutgoingBidirectionalStream();
TestStream* stream6 = session_.CreateOutgoingBidirectionalStream();
- const QuicStreamPriority priority{QuicStreamPriority::kDefaultUrgency,
- /* incremental = */ true};
+ const QuicStreamPriority priority(
+ HttpStreamPriority{HttpStreamPriority::kDefaultUrgency,
+ /* incremental = */ true});
stream2->SetPriority(priority);
stream4->SetPriority(priority);
stream6->SetPriority(priority);
@@ -1075,8 +1076,8 @@
session_.OnCanWrite();
// The next write adds a block for stream 6.
- stream6->SetPriority(QuicStreamPriority{
- kV3HighestPriority, QuicStreamPriority::kDefaultIncremental});
+ stream6->SetPriority(QuicStreamPriority(HttpStreamPriority{
+ kV3HighestPriority, HttpStreamPriority::kDefaultIncremental}));
if (GetQuicReloadableFlag(quic_disable_batch_write)) {
EXPECT_CALL(*stream2, OnCanWrite())
.WillOnce(Invoke([this, stream2, stream6]() {
diff --git a/quiche/quic/core/quic_stream.cc b/quiche/quic/core/quic_stream.cc
index 6a436ff..e570b44 100644
--- a/quiche/quic/core/quic_stream.cc
+++ b/quiche/quic/core/quic_stream.cc
@@ -336,6 +336,7 @@
id_(id),
session_(session),
stream_delegate_(session),
+ priority_(QuicStreamPriority::Default(session->priority_type())),
stream_bytes_read_(stream_bytes_read),
stream_error_(QuicResetStreamError::NoError()),
connection_error_(QUIC_NO_ERROR),
diff --git a/quiche/quic/core/quic_stream_priority.cc b/quiche/quic/core/quic_stream_priority.cc
index 1d2e251..5199a43 100644
--- a/quiche/quic/core/quic_stream_priority.cc
+++ b/quiche/quic/core/quic_stream_priority.cc
@@ -9,23 +9,23 @@
namespace quic {
-std::string SerializePriorityFieldValue(QuicStreamPriority priority) {
+std::string SerializePriorityFieldValue(HttpStreamPriority priority) {
quiche::structured_headers::Dictionary dictionary;
// TODO(b/266722347): Never send `urgency` if value equals default value.
- if ((priority.urgency != QuicStreamPriority::kDefaultUrgency ||
- priority.incremental != QuicStreamPriority::kDefaultIncremental) &&
- priority.urgency >= QuicStreamPriority::kMinimumUrgency &&
- priority.urgency <= QuicStreamPriority::kMaximumUrgency) {
- dictionary[QuicStreamPriority::kUrgencyKey] =
+ if ((priority.urgency != HttpStreamPriority::kDefaultUrgency ||
+ priority.incremental != HttpStreamPriority::kDefaultIncremental) &&
+ priority.urgency >= HttpStreamPriority::kMinimumUrgency &&
+ priority.urgency <= HttpStreamPriority::kMaximumUrgency) {
+ dictionary[HttpStreamPriority::kUrgencyKey] =
quiche::structured_headers::ParameterizedMember(
quiche::structured_headers::Item(
static_cast<int64_t>(priority.urgency)),
{});
}
- if (priority.incremental != QuicStreamPriority::kDefaultIncremental) {
- dictionary[QuicStreamPriority::kIncrementalKey] =
+ if (priority.incremental != HttpStreamPriority::kDefaultIncremental) {
+ dictionary[HttpStreamPriority::kIncrementalKey] =
quiche::structured_headers::ParameterizedMember(
quiche::structured_headers::Item(priority.incremental), {});
}
@@ -40,7 +40,7 @@
return *priority_field_value;
}
-absl::optional<QuicStreamPriority> ParsePriorityFieldValue(
+absl::optional<HttpStreamPriority> ParsePriorityFieldValue(
absl::string_view priority_field_value) {
absl::optional<quiche::structured_headers::Dictionary> parsed_dictionary =
quiche::structured_headers::ParseDictionary(priority_field_value);
@@ -48,8 +48,8 @@
return absl::nullopt;
}
- uint8_t urgency = QuicStreamPriority::kDefaultUrgency;
- bool incremental = QuicStreamPriority::kDefaultIncremental;
+ uint8_t urgency = HttpStreamPriority::kDefaultUrgency;
+ bool incremental = HttpStreamPriority::kDefaultIncremental;
for (const auto& [name, value] : *parsed_dictionary) {
if (value.member_is_inner_list) {
@@ -66,20 +66,20 @@
}
const quiche::structured_headers::Item item = member[0].item;
- if (name == QuicStreamPriority::kUrgencyKey && item.is_integer()) {
+ if (name == HttpStreamPriority::kUrgencyKey && item.is_integer()) {
int parsed_urgency = item.GetInteger();
// Ignore out-of-range values.
- if (parsed_urgency >= QuicStreamPriority::kMinimumUrgency &&
- parsed_urgency <= QuicStreamPriority::kMaximumUrgency) {
+ if (parsed_urgency >= HttpStreamPriority::kMinimumUrgency &&
+ parsed_urgency <= HttpStreamPriority::kMaximumUrgency) {
urgency = parsed_urgency;
}
- } else if (name == QuicStreamPriority::kIncrementalKey &&
+ } else if (name == HttpStreamPriority::kIncrementalKey &&
item.is_boolean()) {
incremental = item.GetBoolean();
}
}
- return QuicStreamPriority{urgency, incremental};
+ return HttpStreamPriority{urgency, incremental};
}
} // namespace quic
diff --git a/quiche/quic/core/quic_stream_priority.h b/quiche/quic/core/quic_stream_priority.h
index de2cce2..b06f475 100644
--- a/quiche/quic/core/quic_stream_priority.h
+++ b/quiche/quic/core/quic_stream_priority.h
@@ -11,13 +11,15 @@
#include "absl/strings/string_view.h"
#include "absl/types/optional.h"
-#include "quiche/quic/platform/api/quic_export.h"
+#include "absl/types/variant.h"
+#include "quiche/quic/core/quic_types.h"
+#include "quiche/common/platform/api/quiche_bug_tracker.h"
+#include "quiche/common/platform/api/quiche_export.h"
namespace quic {
-// Class to hold urgency and incremental values defined by
-// https://httpwg.org/specs/rfc9218.html.
-struct QUICHE_EXPORT QuicStreamPriority {
+// Represents HTTP priorities as defined by RFC 9218.
+struct QUICHE_EXPORT HttpStreamPriority {
static constexpr int kMinimumUrgency = 0;
static constexpr int kMaximumUrgency = 7;
static constexpr int kDefaultUrgency = 3;
@@ -30,36 +32,104 @@
int urgency = kDefaultUrgency;
bool incremental = kDefaultIncremental;
- bool operator==(const QuicStreamPriority& other) const {
+ bool operator==(const HttpStreamPriority& other) const {
return std::tie(urgency, incremental) ==
std::tie(other.urgency, other.incremental);
}
- bool operator!=(const QuicStreamPriority& other) const {
- return !operator==(other);
+ bool operator!=(const HttpStreamPriority& other) const {
+ return !(*this == other);
}
};
-// Functors to be used as template parameters for PriorityWriteScheduler.
-struct QUICHE_EXPORT QuicStreamPriorityToInt {
- int operator()(const QuicStreamPriority& priority) {
- return priority.urgency;
+// Represents WebTransport priorities as defined by
+// <https://w3c.github.io/webtransport/>.
+struct QUICHE_EXPORT WebTransportStreamPriority {
+ enum class StreamType : uint8_t {
+ // WebTransport data streams.
+ kData = 0,
+ // Regular HTTP traffic. Since we're currently only supporting dedicated
+ // HTTP/3 transport, this means that all HTTP traffic is control traffic,
+ // and thus should always go first.
+ kHttp = 1,
+ // Streams that the QUIC stack declares as static.
+ kStatic = 2,
+ };
+
+ // Allows prioritizing control streams over the data streams.
+ StreamType stream_type = StreamType::kData;
+ // https://w3c.github.io/webtransport/#dom-webtransportsendstreamoptions-sendorder
+ int64_t send_order = 0;
+
+ bool operator==(const WebTransportStreamPriority& other) const {
+ return stream_type == other.stream_type && send_order == other.send_order;
+ }
+ bool operator!=(const WebTransportStreamPriority& other) const {
+ return !(*this == other);
}
};
-struct QUICHE_EXPORT IntToQuicStreamPriority {
- QuicStreamPriority operator()(int urgency) {
- return QuicStreamPriority{urgency};
+// A class that wraps different types of priorities that can be used for
+// scheduling QUIC streams.
+class QUICHE_EXPORT QuicStreamPriority {
+ public:
+ explicit QuicStreamPriority(HttpStreamPriority priority) : value_(priority) {}
+ explicit QuicStreamPriority(WebTransportStreamPriority priority)
+ : value_(priority) {}
+
+ static QuicStreamPriority Default(QuicPriorityType type) {
+ switch (type) {
+ case QuicPriorityType::kHttp:
+ return QuicStreamPriority(HttpStreamPriority());
+ case QuicPriorityType::kWebTransport:
+ return QuicStreamPriority(WebTransportStreamPriority());
+ }
}
+
+ QuicPriorityType type() const { return std::visit(TypeExtractor(), value_); }
+
+ HttpStreamPriority http() const {
+ if (absl::holds_alternative<HttpStreamPriority>(value_)) {
+ return absl::get<HttpStreamPriority>(value_);
+ }
+ QUICHE_BUG(invalid_priority_type_http)
+ << "Tried to access HTTP priority for a priority type" << type();
+ return HttpStreamPriority();
+ }
+ WebTransportStreamPriority web_transport() const {
+ if (absl::holds_alternative<WebTransportStreamPriority>(value_)) {
+ return absl::get<WebTransportStreamPriority>(value_);
+ }
+ QUICHE_BUG(invalid_priority_type_wt)
+ << "Tried to access WebTransport priority for a priority type"
+ << type();
+ return WebTransportStreamPriority();
+ }
+
+ bool operator==(const QuicStreamPriority& other) const {
+ return value_ == other.value_;
+ }
+
+ private:
+ struct TypeExtractor {
+ QuicPriorityType operator()(const HttpStreamPriority&) {
+ return QuicPriorityType::kHttp;
+ }
+ QuicPriorityType operator()(const WebTransportStreamPriority&) {
+ return QuicPriorityType::kWebTransport;
+ }
+ };
+
+ absl::variant<HttpStreamPriority, WebTransportStreamPriority> value_;
};
// Serializes the Priority Field Value for a PRIORITY_UPDATE frame.
QUICHE_EXPORT std::string SerializePriorityFieldValue(
- QuicStreamPriority priority);
+ HttpStreamPriority priority);
// Parses the Priority Field Value field of a PRIORITY_UPDATE frame.
// Returns nullopt on failure.
-QUICHE_EXPORT absl::optional<QuicStreamPriority> ParsePriorityFieldValue(
+QUICHE_EXPORT absl::optional<HttpStreamPriority> ParsePriorityFieldValue(
absl::string_view priority_field_value);
} // namespace quic
diff --git a/quiche/quic/core/quic_stream_priority_test.cc b/quiche/quic/core/quic_stream_priority_test.cc
index 88be74e..db5d1a9 100644
--- a/quiche/quic/core/quic_stream_priority_test.cc
+++ b/quiche/quic/core/quic_stream_priority_test.cc
@@ -4,30 +4,73 @@
#include "quiche/quic/core/quic_stream_priority.h"
+#include "quiche/quic/core/quic_types.h"
#include "quiche/common/platform/api/quiche_test.h"
namespace quic::test {
-TEST(QuicStreamPriority, DefaultConstructed) {
- QuicStreamPriority priority;
+TEST(HttpStreamPriority, DefaultConstructed) {
+ HttpStreamPriority priority;
- EXPECT_EQ(QuicStreamPriority::kDefaultUrgency, priority.urgency);
- EXPECT_EQ(QuicStreamPriority::kDefaultIncremental, priority.incremental);
+ EXPECT_EQ(HttpStreamPriority::kDefaultUrgency, priority.urgency);
+ EXPECT_EQ(HttpStreamPriority::kDefaultIncremental, priority.incremental);
+}
+
+TEST(HttpStreamPriority, Equals) {
+ EXPECT_EQ((HttpStreamPriority()),
+ (HttpStreamPriority{HttpStreamPriority::kDefaultUrgency,
+ HttpStreamPriority::kDefaultIncremental}));
+ EXPECT_EQ((HttpStreamPriority{5, true}), (HttpStreamPriority{5, true}));
+ EXPECT_EQ((HttpStreamPriority{2, false}), (HttpStreamPriority{2, false}));
+ EXPECT_EQ((HttpStreamPriority{11, true}), (HttpStreamPriority{11, true}));
+
+ EXPECT_NE((HttpStreamPriority{1, true}), (HttpStreamPriority{3, true}));
+ EXPECT_NE((HttpStreamPriority{4, false}), (HttpStreamPriority{4, true}));
+ EXPECT_NE((HttpStreamPriority{6, true}), (HttpStreamPriority{2, false}));
+ EXPECT_NE((HttpStreamPriority{12, true}), (HttpStreamPriority{9, true}));
+ EXPECT_NE((HttpStreamPriority{2, false}), (HttpStreamPriority{8, false}));
+}
+
+TEST(WebTransportStreamPriority, DefaultConstructed) {
+ WebTransportStreamPriority priority;
+
+ EXPECT_EQ(priority.stream_type,
+ WebTransportStreamPriority::StreamType::kData);
+ EXPECT_EQ(priority.send_order, 0);
+}
+
+TEST(WebTransportStreamPriority, Equals) {
+ EXPECT_EQ(WebTransportStreamPriority(),
+ (WebTransportStreamPriority{
+ WebTransportStreamPriority::StreamType::kData, 0}));
+ EXPECT_NE(WebTransportStreamPriority(),
+ (WebTransportStreamPriority{
+ WebTransportStreamPriority::StreamType::kData, 1}));
+ EXPECT_NE(WebTransportStreamPriority(),
+ (WebTransportStreamPriority{
+ WebTransportStreamPriority::StreamType::kHttp, 0}));
+}
+
+TEST(QuicStreamPriority, Default) {
+ EXPECT_EQ(QuicStreamPriority::Default(QuicPriorityType::kHttp).http(),
+ HttpStreamPriority());
+ EXPECT_EQ(QuicStreamPriority::Default(QuicPriorityType::kWebTransport)
+ .web_transport(),
+ WebTransportStreamPriority());
}
TEST(QuicStreamPriority, Equals) {
- EXPECT_EQ((QuicStreamPriority()),
- (QuicStreamPriority{QuicStreamPriority::kDefaultUrgency,
- QuicStreamPriority::kDefaultIncremental}));
- EXPECT_EQ((QuicStreamPriority{5, true}), (QuicStreamPriority{5, true}));
- EXPECT_EQ((QuicStreamPriority{2, false}), (QuicStreamPriority{2, false}));
- EXPECT_EQ((QuicStreamPriority{11, true}), (QuicStreamPriority{11, true}));
+ EXPECT_EQ(QuicStreamPriority::Default(QuicPriorityType::kHttp),
+ QuicStreamPriority(HttpStreamPriority()));
+ EXPECT_EQ(QuicStreamPriority::Default(QuicPriorityType::kWebTransport),
+ QuicStreamPriority(WebTransportStreamPriority()));
+}
- EXPECT_NE((QuicStreamPriority{1, true}), (QuicStreamPriority{3, true}));
- EXPECT_NE((QuicStreamPriority{4, false}), (QuicStreamPriority{4, true}));
- EXPECT_NE((QuicStreamPriority{6, true}), (QuicStreamPriority{2, false}));
- EXPECT_NE((QuicStreamPriority{12, true}), (QuicStreamPriority{9, true}));
- EXPECT_NE((QuicStreamPriority{2, false}), (QuicStreamPriority{8, false}));
+TEST(QuicStreamPriority, Type) {
+ EXPECT_EQ(QuicStreamPriority(HttpStreamPriority()).type(),
+ QuicPriorityType::kHttp);
+ EXPECT_EQ(QuicStreamPriority(WebTransportStreamPriority()).type(),
+ QuicPriorityType::kWebTransport);
}
TEST(SerializePriorityFieldValueTest, SerializePriorityFieldValue) {
@@ -48,7 +91,7 @@
TEST(ParsePriorityFieldValueTest, ParsePriorityFieldValue) {
// Default values
- absl::optional<QuicStreamPriority> result = ParsePriorityFieldValue("");
+ absl::optional<HttpStreamPriority> result = ParsePriorityFieldValue("");
ASSERT_TRUE(result.has_value());
EXPECT_EQ(3, result->urgency);
EXPECT_FALSE(result->incremental);
diff --git a/quiche/quic/core/quic_types.cc b/quiche/quic/core/quic_types.cc
index 46b2fc2..e046092 100644
--- a/quiche/quic/core/quic_types.cc
+++ b/quiche/quic/core/quic_types.cc
@@ -431,6 +431,21 @@
return os;
}
+QUICHE_EXPORT std::string QuicPriorityTypeToString(QuicPriorityType type) {
+ switch (type) {
+ case quic::QuicPriorityType::kHttp:
+ return "HTTP (RFC 9218)";
+ case quic::QuicPriorityType::kWebTransport:
+ return "WebTransport (W3C API)";
+ }
+ return "(unknown)";
+}
+QUIC_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os,
+ QuicPriorityType type) {
+ os << QuicPriorityTypeToString(type);
+ return os;
+}
+
#undef RETURN_STRING_LITERAL // undef for jumbo builds
} // namespace quic
diff --git a/quiche/quic/core/quic_types.h b/quiche/quic/core/quic_types.h
index c3a71bb..1eba1f7 100644
--- a/quiche/quic/core/quic_types.h
+++ b/quiche/quic/core/quic_types.h
@@ -904,6 +904,18 @@
QuicPacketCount ce = 0;
};
+// Type of the priorities used by a QUIC session.
+enum class QuicPriorityType : uint8_t {
+ // HTTP priorities as defined by RFC 9218
+ kHttp,
+ // WebTransport priorities as defined by <https://w3c.github.io/webtransport/>
+ kWebTransport,
+};
+
+QUICHE_EXPORT std::string QuicPriorityTypeToString(QuicPriorityType type);
+QUIC_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os,
+ QuicPriorityType type);
+
} // namespace quic
#endif // QUICHE_QUIC_CORE_QUIC_TYPES_H_
diff --git a/quiche/quic/core/quic_write_blocked_list.cc b/quiche/quic/core/quic_write_blocked_list.cc
index 3f09167..475bdc1 100644
--- a/quiche/quic/core/quic_write_blocked_list.cc
+++ b/quiche/quic/core/quic_write_blocked_list.cc
@@ -39,10 +39,8 @@
return static_stream_id;
}
- const auto id_and_priority =
+ const auto [id, priority] =
priority_write_scheduler_.PopNextReadyStreamAndPriority();
- const QuicStreamId id = std::get<0>(id_and_priority);
- const QuicStreamPriority& priority = std::get<1>(id_and_priority);
const spdy::SpdyPriority urgency = priority.urgency;
const bool incremental = priority.incremental;
@@ -86,7 +84,7 @@
return;
}
- priority_write_scheduler_.RegisterStream(stream_id, priority);
+ priority_write_scheduler_.RegisterStream(stream_id, priority.http());
}
void QuicWriteBlockedList::UnregisterStream(QuicStreamId stream_id) {
@@ -99,7 +97,8 @@
void QuicWriteBlockedList::UpdateStreamPriority(
QuicStreamId stream_id, const QuicStreamPriority& new_priority) {
QUICHE_DCHECK(!static_stream_collection_.IsRegistered(stream_id));
- priority_write_scheduler_.UpdateStreamPriority(stream_id, new_priority);
+ priority_write_scheduler_.UpdateStreamPriority(stream_id,
+ new_priority.http());
}
void QuicWriteBlockedList::UpdateBytesForStream(QuicStreamId stream_id,
diff --git a/quiche/quic/core/quic_write_blocked_list.h b/quiche/quic/core/quic_write_blocked_list.h
index f6726dc..1c7f25a 100644
--- a/quiche/quic/core/quic_write_blocked_list.h
+++ b/quiche/quic/core/quic_write_blocked_list.h
@@ -98,7 +98,7 @@
bool ShouldYield(QuicStreamId id) const override;
QuicStreamPriority GetPriorityOfStream(QuicStreamId id) const override {
- return priority_write_scheduler_.GetStreamPriority(id);
+ return QuicStreamPriority(priority_write_scheduler_.GetStreamPriority(id));
}
// Pops the highest priority stream, special casing static streams. Latches
@@ -134,9 +134,20 @@
bool IsStreamBlocked(QuicStreamId stream_id) const override;
private:
- http2::PriorityWriteScheduler<QuicStreamId, QuicStreamPriority,
- QuicStreamPriorityToInt,
- IntToQuicStreamPriority>
+ struct QUICHE_EXPORT HttpStreamPriorityToInt {
+ int operator()(const HttpStreamPriority& priority) {
+ return priority.urgency;
+ }
+ };
+
+ struct QUICHE_EXPORT IntToHttpStreamPriority {
+ HttpStreamPriority operator()(int urgency) {
+ return HttpStreamPriority{urgency};
+ }
+ };
+ http2::PriorityWriteScheduler<QuicStreamId, HttpStreamPriority,
+ HttpStreamPriorityToInt,
+ IntToHttpStreamPriority>
priority_write_scheduler_;
// If performing batch writes, this will be the stream ID of the stream doing
diff --git a/quiche/quic/core/quic_write_blocked_list_test.cc b/quiche/quic/core/quic_write_blocked_list_test.cc
index 4272358..ba6569e 100644
--- a/quiche/quic/core/quic_write_blocked_list_test.cc
+++ b/quiche/quic/core/quic_write_blocked_list_test.cc
@@ -57,8 +57,9 @@
QuicStreamId PopFront() { return write_blocked_list_->PopFront(); }
void RegisterStream(QuicStreamId stream_id, bool is_static_stream,
- const QuicStreamPriority& priority) {
- write_blocked_list_->RegisterStream(stream_id, is_static_stream, priority);
+ const HttpStreamPriority& priority) {
+ write_blocked_list_->RegisterStream(stream_id, is_static_stream,
+ QuicStreamPriority(priority));
}
void UnregisterStream(QuicStreamId stream_id) {
@@ -66,8 +67,9 @@
}
void UpdateStreamPriority(QuicStreamId stream_id,
- const QuicStreamPriority& new_priority) {
- write_blocked_list_->UpdateStreamPriority(stream_id, new_priority);
+ const HttpStreamPriority& new_priority) {
+ write_blocked_list_->UpdateStreamPriority(stream_id,
+ QuicStreamPriority(new_priority));
}
void UpdateBytesForStream(QuicStreamId stream_id, size_t bytes) {
@@ -95,14 +97,14 @@
RegisterStream(1, kStatic, {kV3HighestPriority, kNotIncremental});
RegisterStream(3, kStatic, {kV3HighestPriority, kNotIncremental});
- EXPECT_EQ(kV3LowestPriority, GetPriorityOfStream(40).urgency);
- EXPECT_EQ(kNotIncremental, GetPriorityOfStream(40).incremental);
+ EXPECT_EQ(kV3LowestPriority, GetPriorityOfStream(40).http().urgency);
+ EXPECT_EQ(kNotIncremental, GetPriorityOfStream(40).http().incremental);
- EXPECT_EQ(kV3HighestPriority, GetPriorityOfStream(23).urgency);
- EXPECT_EQ(kIncremental, GetPriorityOfStream(23).incremental);
+ EXPECT_EQ(kV3HighestPriority, GetPriorityOfStream(23).http().urgency);
+ EXPECT_EQ(kIncremental, GetPriorityOfStream(23).http().incremental);
- EXPECT_EQ(kV3HighestPriority, GetPriorityOfStream(17).urgency);
- EXPECT_EQ(kNotIncremental, GetPriorityOfStream(17).incremental);
+ EXPECT_EQ(kV3HighestPriority, GetPriorityOfStream(17).http().urgency);
+ EXPECT_EQ(kNotIncremental, GetPriorityOfStream(17).http().incremental);
AddStream(40);
EXPECT_TRUE(IsStreamBlocked(40));
@@ -577,27 +579,27 @@
RegisterStream(1, kStatic, {2, kNotIncremental});
RegisterStream(3, kStatic, {kV3HighestPriority, kNotIncremental});
- EXPECT_EQ(kV3LowestPriority, GetPriorityOfStream(40).urgency);
- EXPECT_EQ(kNotIncremental, GetPriorityOfStream(40).incremental);
+ EXPECT_EQ(kV3LowestPriority, GetPriorityOfStream(40).http().urgency);
+ EXPECT_EQ(kNotIncremental, GetPriorityOfStream(40).http().incremental);
- EXPECT_EQ(6, GetPriorityOfStream(23).urgency);
- EXPECT_EQ(kIncremental, GetPriorityOfStream(23).incremental);
+ EXPECT_EQ(6, GetPriorityOfStream(23).http().urgency);
+ EXPECT_EQ(kIncremental, GetPriorityOfStream(23).http().incremental);
- EXPECT_EQ(kV3HighestPriority, GetPriorityOfStream(17).urgency);
- EXPECT_EQ(kNotIncremental, GetPriorityOfStream(17).incremental);
+ EXPECT_EQ(kV3HighestPriority, GetPriorityOfStream(17).http().urgency);
+ EXPECT_EQ(kNotIncremental, GetPriorityOfStream(17).http().incremental);
UpdateStreamPriority(40, {3, kIncremental});
UpdateStreamPriority(23, {kV3HighestPriority, kNotIncremental});
UpdateStreamPriority(17, {5, kNotIncremental});
- EXPECT_EQ(3, GetPriorityOfStream(40).urgency);
- EXPECT_EQ(kIncremental, GetPriorityOfStream(40).incremental);
+ EXPECT_EQ(3, GetPriorityOfStream(40).http().urgency);
+ EXPECT_EQ(kIncremental, GetPriorityOfStream(40).http().incremental);
- EXPECT_EQ(kV3HighestPriority, GetPriorityOfStream(23).urgency);
- EXPECT_EQ(kNotIncremental, GetPriorityOfStream(23).incremental);
+ EXPECT_EQ(kV3HighestPriority, GetPriorityOfStream(23).http().urgency);
+ EXPECT_EQ(kNotIncremental, GetPriorityOfStream(23).http().incremental);
- EXPECT_EQ(5, GetPriorityOfStream(17).urgency);
- EXPECT_EQ(kNotIncremental, GetPriorityOfStream(17).incremental);
+ EXPECT_EQ(5, GetPriorityOfStream(17).http().urgency);
+ EXPECT_EQ(kNotIncremental, GetPriorityOfStream(17).http().incremental);
AddStream(40);
AddStream(23);
@@ -637,13 +639,13 @@
RegisterStream(3, kNotStatic, {6, kNotIncremental});
RegisterStream(4, kNotStatic, {6, kNotIncremental});
- EXPECT_EQ(6, GetPriorityOfStream(3).urgency);
- EXPECT_EQ(kNotIncremental, GetPriorityOfStream(3).incremental);
+ EXPECT_EQ(6, GetPriorityOfStream(3).http().urgency);
+ EXPECT_EQ(kNotIncremental, GetPriorityOfStream(3).http().incremental);
UpdateStreamPriority(3, {6, kIncremental});
- EXPECT_EQ(6, GetPriorityOfStream(3).urgency);
- EXPECT_EQ(kIncremental, GetPriorityOfStream(3).incremental);
+ EXPECT_EQ(6, GetPriorityOfStream(3).http().urgency);
+ EXPECT_EQ(kIncremental, GetPriorityOfStream(3).http().incremental);
AddStream(3);
AddStream(4);
@@ -656,13 +658,13 @@
RegisterStream(5, kNotStatic, {6, kIncremental});
RegisterStream(6, kNotStatic, {6, kIncremental});
- EXPECT_EQ(6, GetPriorityOfStream(6).urgency);
- EXPECT_EQ(kIncremental, GetPriorityOfStream(6).incremental);
+ EXPECT_EQ(6, GetPriorityOfStream(6).http().urgency);
+ EXPECT_EQ(kIncremental, GetPriorityOfStream(6).http().incremental);
UpdateStreamPriority(6, {6, kNotIncremental});
- EXPECT_EQ(6, GetPriorityOfStream(6).urgency);
- EXPECT_EQ(kNotIncremental, GetPriorityOfStream(6).incremental);
+ EXPECT_EQ(6, GetPriorityOfStream(6).http().urgency);
+ EXPECT_EQ(kNotIncremental, GetPriorityOfStream(6).http().incremental);
AddStream(5);
AddStream(6);
diff --git a/quiche/quic/qbone/qbone_stream_test.cc b/quiche/quic/qbone/qbone_stream_test.cc
index ea5fafb..b7cc198 100644
--- a/quiche/quic/qbone/qbone_stream_test.cc
+++ b/quiche/quic/qbone/qbone_stream_test.cc
@@ -71,7 +71,7 @@
write_blocked_streams()->RegisterStream(
stream_id,
/* is_static_stream = */ false,
- QuicStreamPriority{3, QuicStreamPriority::kDefaultIncremental});
+ QuicStreamPriority::Default(priority_type()));
}
// The session take ownership of the stream.
diff --git a/quiche/quic/test_tools/quic_test_client.cc b/quiche/quic/test_tools/quic_test_client.cc
index 224046a..a617348 100644
--- a/quiche/quic/test_tools/quic_test_client.cc
+++ b/quiche/quic/test_tools/quic_test_client.cc
@@ -543,8 +543,8 @@
if (!latest_created_stream_) {
SetLatestCreatedStream(client_->CreateClientStream());
if (latest_created_stream_) {
- latest_created_stream_->SetPriority(
- QuicStreamPriority{priority_, /* incremental = */ false});
+ latest_created_stream_->SetPriority(QuicStreamPriority(
+ HttpStreamPriority{priority_, /* incremental = */ false}));
}
}
diff --git a/quiche/quic/tools/quic_simple_server_session.cc b/quiche/quic/tools/quic_simple_server_session.cc
index a8ac5f0..ed5b40d 100644
--- a/quiche/quic/tools/quic_simple_server_session.cc
+++ b/quiche/quic/tools/quic_simple_server_session.cc
@@ -196,9 +196,9 @@
QUICHE_DCHECK_EQ(promised_info.stream_id, promised_stream->id());
QUIC_DLOG(INFO) << "created server push stream " << promised_stream->id();
- promised_stream->SetPriority(
- QuicStreamPriority{promised_info.precedence.spdy3_priority(),
- QuicStreamPriority::kDefaultIncremental});
+ promised_stream->SetPriority(QuicStreamPriority(
+ HttpStreamPriority{promised_info.precedence.spdy3_priority(),
+ HttpStreamPriority::kDefaultIncremental}));
spdy::Http2HeaderBlock request_headers(
std::move(promised_info.request_headers));
diff --git a/quiche/quic/tools/quic_simple_server_session_test.cc b/quiche/quic/tools/quic_simple_server_session_test.cc
index c30283c..9bb5a1a 100644
--- a/quiche/quic/tools/quic_simple_server_session_test.cc
+++ b/quiche/quic/tools/quic_simple_server_session_test.cc
@@ -502,7 +502,8 @@
if (!VersionUsesHttp3(transport_version())) {
session_->RegisterStreamPriority(
QuicUtils::GetHeadersStreamId(transport_version()),
- /*is_static=*/true, QuicStreamPriority());
+ /*is_static=*/true,
+ QuicStreamPriority::Default(session_->priority_type()));
}
// Create push streams till reaching the upper limit of allowed open streams.