Commit 703fea9c authored by Renjie Tang's avatar Renjie Tang Committed by Commit Bot

Send HTTP/3 priority frames in QUIC version 99.

Version 99 is adopting HTTP/3 priority, which is different from H2 priority.

After this CL, no priority related stuff will be sent on headers stream any more.

Change-Id: I00aab1b9daf5bc288b0afde3211d169bcd92f6e9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1710850Reviewed-by: default avatarRyan Hamilton <rch@chromium.org>
Commit-Queue: Ryan Hamilton <rch@chromium.org>
Cr-Commit-Position: refs/heads/master@{#680148}
parent e2250746
......@@ -969,11 +969,23 @@ void QuicChromiumClientSession::UnregisterStreamPriority(quic::QuicStreamId id,
void QuicChromiumClientSession::UpdateStreamPriority(
quic::QuicStreamId id,
spdy::SpdyPriority new_priority) {
if (headers_include_h2_stream_dependency_) {
if (headers_include_h2_stream_dependency_ ||
VersionHasStreamType(connection()->transport_version())) {
auto updates = priority_dependency_state_.OnStreamUpdate(id, new_priority);
for (auto update : updates) {
WritePriority(update.id, update.parent_stream_id, update.weight,
update.exclusive);
if (!VersionHasStreamType(connection()->transport_version())) {
WritePriority(update.id, update.parent_stream_id, update.weight,
update.exclusive);
} else {
quic::PriorityFrame frame;
frame.weight = update.weight;
frame.exclusive = update.exclusive;
frame.prioritized_element_id = update.id;
frame.prioritized_type = quic::REQUEST_STREAM;
frame.dependency_type = quic::REQUEST_STREAM;
frame.element_dependency_id = update.parent_stream_id;
WriteH3Priority(frame);
}
}
}
quic::QuicSpdySession::UpdateStreamPriority(id, new_priority);
......@@ -3030,7 +3042,8 @@ bool QuicChromiumClientSession::HandlePromised(
weak_factory_.GetWeakPtr(), GURL(pushed_url)),
net_log_);
}
if (headers_include_h2_stream_dependency_) {
if (headers_include_h2_stream_dependency_ ||
VersionHasStreamType(connection()->transport_version())) {
// Even though the promised stream will not be created until after the
// push promise headers are received, send a PRIORITY frame for the
// promised stream ID. Send |kDefaultPriority| since that will be the
......@@ -3041,7 +3054,18 @@ bool QuicChromiumClientSession::HandlePromised(
bool exclusive = false;
priority_dependency_state_.OnStreamCreation(
promised_id, priority, &parent_stream_id, &weight, &exclusive);
WritePriority(promised_id, parent_stream_id, weight, exclusive);
if (!VersionHasStreamType(connection()->transport_version())) {
WritePriority(promised_id, parent_stream_id, weight, exclusive);
} else {
quic::PriorityFrame frame;
frame.weight = weight;
frame.exclusive = exclusive;
frame.prioritized_type = quic::PUSH_STREAM;
frame.prioritized_element_id = promised_id;
frame.dependency_type = quic::REQUEST_STREAM;
frame.element_dependency_id = parent_stream_id;
WriteH3Priority(frame);
}
}
}
net_log_.AddEvent(NetLogEventType::QUIC_SESSION_PUSH_PROMISE_RECEIVED,
......
......@@ -2270,8 +2270,9 @@ TEST_P(QuicHttpStreamTest, ServerPushVaryCheckFail) {
AddWrite(ConstructInitialSettingsPacket());
uint64_t client_packet_number = 2;
if (client_headers_include_h2_stream_dependency_ &&
version_.transport_version >= quic::QUIC_VERSION_43) {
if ((client_headers_include_h2_stream_dependency_ &&
version_.transport_version >= quic::QUIC_VERSION_43) ||
VersionHasStreamType(version_.transport_version)) {
AddWrite(ConstructClientPriorityPacket(client_packet_number++,
kIncludeVersion, promise_id_, 0,
DEFAULT_PRIORITY));
......
......@@ -6094,8 +6094,9 @@ TEST_P(QuicNetworkTransactionTest, QuicServerPush) {
1, GetNthClientInitiatedBidirectionalStreamId(0),
GetNthServerInitiatedUnidirectionalStreamId(0), false,
GetRequestHeaders("GET", "https", "/pushed.jpg"), &server_maker_));
if (client_headers_include_h2_stream_dependency_ &&
version_.transport_version >= quic::QUIC_VERSION_43) {
if ((client_headers_include_h2_stream_dependency_ &&
version_.transport_version >= quic::QUIC_VERSION_43) ||
VersionHasStreamType(version_.transport_version)) {
mock_quic_data.AddWrite(
SYNCHRONOUS,
ConstructClientPriorityPacket(
......@@ -6183,8 +6184,9 @@ TEST_P(QuicNetworkTransactionTest, CancelServerPushAfterConnectionClose) {
1, GetNthClientInitiatedBidirectionalStreamId(0),
GetNthServerInitiatedUnidirectionalStreamId(0), false,
GetRequestHeaders("GET", "https", "/pushed.jpg"), &server_maker_));
if (client_headers_include_h2_stream_dependency_ &&
version_.transport_version >= quic::QUIC_VERSION_43) {
if ((client_headers_include_h2_stream_dependency_ &&
version_.transport_version >= quic::QUIC_VERSION_43) ||
VersionHasStreamType(version_.transport_version)) {
mock_quic_data.AddWrite(
SYNCHRONOUS,
ConstructClientPriorityPacket(
......@@ -6436,8 +6438,9 @@ TEST_P(QuicNetworkTransactionTest, RawHeaderSizeSuccessfullPushHeadersFirst) {
GetNthServerInitiatedUnidirectionalStreamId(0), false,
GetRequestHeaders("GET", "https", "/pushed.jpg"), &server_maker_));
if (client_headers_include_h2_stream_dependency_ &&
version_.transport_version >= quic::QUIC_VERSION_43) {
if ((client_headers_include_h2_stream_dependency_ &&
version_.transport_version >= quic::QUIC_VERSION_43) ||
VersionHasStreamType(version_.transport_version)) {
mock_quic_data.AddWrite(
SYNCHRONOUS,
ConstructClientPriorityPacket(
......@@ -7084,8 +7087,10 @@ TEST_P(QuicNetworkTransactionTest, QuicServerPushMatchesRequestWithBody) {
1, GetNthClientInitiatedBidirectionalStreamId(0),
GetNthServerInitiatedUnidirectionalStreamId(0), false,
GetRequestHeaders("GET", "https", "/pushed.jpg"), &server_maker_));
if (client_headers_include_h2_stream_dependency_ &&
version_.transport_version >= quic::QUIC_VERSION_43) {
if ((client_headers_include_h2_stream_dependency_ &&
version_.transport_version >= quic::QUIC_VERSION_43) ||
VersionHasStreamType(version_.transport_version)) {
mock_quic_data.AddWrite(
SYNCHRONOUS,
ConstructClientPriorityPacket(
......
......@@ -1383,13 +1383,35 @@ QuicTestPacketMaker::MakePriorityPacket(uint64_t packet_number,
}
int weight = spdy::Spdy3PriorityToHttp2Weight(priority);
bool exclusive = client_headers_include_h2_stream_dependency_;
spdy::SpdyPriorityIR priority_frame(id, parent_stream_id, weight, exclusive);
spdy::SpdySerializedFrame spdy_frame(
spdy_request_framer_.SerializeFrame(priority_frame));
if (!VersionUsesQpack(version_.transport_version)) {
spdy::SpdyPriorityIR priority_frame(id, parent_stream_id, weight,
exclusive);
spdy::SpdySerializedFrame spdy_frame(
spdy_request_framer_.SerializeFrame(priority_frame));
quic::QuicStreamFrame quic_frame = GenerateNextStreamFrame(
quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false,
quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
quic::QuicStreamFrame quic_frame = GenerateNextStreamFrame(
quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false,
quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
InitializeHeader(packet_number, should_include_version);
return MakePacket(header_, quic::QuicFrame(quic_frame));
}
quic::PriorityFrame frame;
frame.weight = weight;
frame.exclusive = true;
frame.prioritized_element_id = id;
frame.element_dependency_id = parent_stream_id;
frame.dependency_type = quic::REQUEST_STREAM;
frame.prioritized_type =
quic::QuicUtils::IsServerInitiatedStreamId(version_.transport_version, id)
? quic::PUSH_STREAM
: quic::REQUEST_STREAM;
std::unique_ptr<char[]> buffer;
quic::QuicByteCount frame_length =
http_encoder_.SerializePriorityFrame(frame, &buffer);
std::string priority_data = std::string(buffer.get(), frame_length);
quic::QuicStreamFrame quic_frame =
GenerateNextStreamFrame(2, false, priority_data);
InitializeHeader(packet_number, should_include_version);
return MakePacket(header_, quic::QuicFrame(quic_frame));
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment