Skip to content

Commit b728cf8

Browse files
pfarcasanufacebook-github-bot
authored andcommittedMar 10, 2025·
support paused priority
Reviewed By: lnicco Differential Revision: D68019424 fbshipit-source-id: 30eeb0acc341f3120d59901150d0a27d91d720ff
1 parent 53a2f70 commit b728cf8

7 files changed

+54
-14
lines changed
 

‎proxygen/lib/http/HTTPMessage.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ std::string httpPriorityToString(const HTTPPriority& pri) {
3636
"u=",
3737
std::min(static_cast<uint8_t>(proxygen::kMaxPriority), pri.urgency),
3838
pri.incremental ? ",i" : "",
39-
pri.orderId > 0 ? folly::to<std::string>(",o=", pri.orderId) : "");
39+
pri.orderId > 0 ? folly::to<std::string>(",o=", pri.orderId) : "",
40+
pri.paused ? ",p" : "");
4041
}
4142

4243
std::mutex HTTPMessage::mutexDump_;

‎proxygen/lib/http/HTTPMessage.h

+10-5
Original file line numberDiff line numberDiff line change
@@ -36,32 +36,37 @@ constexpr uint8_t kDefaultHttpPriorityUrgency = 3;
3636
// We default incremental to True, different from the draft
3737
constexpr bool kDefaultHttpPriorityIncremental = true;
3838
constexpr uint64_t kDefaultOrderId = 0;
39+
constexpr bool kDefaultPaused = false;
3940
constexpr int8_t kMinPriority = 0;
4041
constexpr int8_t kMaxPriority = 7;
4142

4243
struct HTTPPriority {
4344
uint8_t urgency : 3;
4445
bool incremental : 1;
45-
uint64_t orderId : 58;
46+
uint64_t orderId : 57;
47+
bool paused : 1;
4648

4749
HTTPPriority()
4850
: urgency(kDefaultHttpPriorityUrgency),
4951
incremental(kDefaultHttpPriorityIncremental),
50-
orderId(kDefaultOrderId) {
52+
orderId(kDefaultOrderId),
53+
paused(kDefaultPaused) {
5154
}
5255

5356
HTTPPriority(uint8_t urgencyIn,
5457
bool incrementalIn,
55-
uint64_t orderIdIn = kDefaultOrderId)
58+
uint64_t orderIdIn = kDefaultOrderId,
59+
bool pausedIn = kDefaultPaused)
5660
: urgency(std::min(urgencyIn, static_cast<uint8_t>(kMaxPriority))),
5761
incremental(incrementalIn),
58-
orderId(orderIdIn) {
62+
orderId(orderIdIn),
63+
paused(pausedIn) {
5964
}
6065
};
6166

6267
inline bool operator==(const HTTPPriority& a, const HTTPPriority& b) {
6368
return a.urgency == b.urgency && a.incremental == b.incremental &&
64-
a.orderId == b.orderId;
69+
a.orderId == b.orderId && a.paused == b.paused;
6570
}
6671

6772
// Convert Priority to a string representation in the form of "u=urgency[,i]"

‎proxygen/lib/http/HTTPPriorityFunctions.cpp

+5-2
Original file line numberDiff line numberDiff line change
@@ -63,19 +63,22 @@ folly::Optional<HTTPPriority> httpPriorityFromString(
6363
bool uMissing = false;
6464
bool iMissing = false;
6565
bool oMissing = false;
66+
bool pMissing = false;
6667
bool malformed = false;
6768
int64_t urgency = getWithDefault<int64_t>(
6869
dict, "u", (int64_t)kDefaultHttpPriorityUrgency, uMissing, malformed);
6970
bool incremental = getWithDefault(dict, "i", false, iMissing, malformed);
7071
auto orderId = getWithDefault<int64_t>(dict, "o", 0, oMissing, malformed);
72+
auto paused = getWithDefault(dict, "p", false, pMissing, malformed);
7173
if ((urgency > kMaxPriority || urgency < kMinPriority) || (orderId < 0) ||
72-
(uMissing && iMissing && oMissing) || malformed) {
74+
(uMissing && iMissing && oMissing && pMissing) || malformed) {
7375
logBadHeader = true;
7476
return folly::none;
7577
}
7678
return HTTPPriority(static_cast<uint8_t>(urgency),
7779
incremental,
78-
static_cast<uint64_t>(orderId));
80+
static_cast<uint64_t>(orderId),
81+
paused);
7982
}
8083

8184
} // namespace proxygen

‎proxygen/lib/http/session/HQDownstreamSession.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -285,8 +285,10 @@ folly::Optional<HTTPHeaders> HQDownstreamSession::getExtraHeaders(
285285
}
286286
HTTPHeaders extraHeaders;
287287
extraHeaders.add(HTTP_HEADER_PRIORITY,
288-
httpPriorityToString(
289-
HTTPPriority(priority->level, priority->incremental)));
288+
httpPriorityToString(HTTPPriority(priority->level,
289+
priority->incremental,
290+
priority->orderId,
291+
priority->paused)));
290292
return extraHeaders;
291293
}
292294

‎proxygen/lib/http/session/HQSession.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ quic::QuicErrorCode quicControlStreamError(quic::QuicErrorCode error) {
8888
}
8989

9090
quic::Priority toQuicPriority(const proxygen::HTTPPriority& pri) {
91-
return quic::Priority(pri.urgency, pri.incremental, pri.orderId);
91+
return {pri.urgency, pri.incremental, pri.orderId, pri.paused};
9292
}
9393

9494
// Get the size of the WebTransport stream preface without actually encoding it

‎proxygen/lib/http/test/HTTPMessageTest.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -776,6 +776,14 @@ TEST(HTTPMessage, HTTPPriorityOrderIdSetGet) {
776776
EXPECT_EQ(priHeaderViaGetter->orderId, 10);
777777
}
778778

779+
TEST(HTTPMessage, HTTPPriorityPausedSetGet) {
780+
HTTPMessage message;
781+
message.setHTTPPriority(HTTPPriority(7, false, 0, true /* paused */));
782+
EXPECT_TRUE(httpPriorityFromHTTPMessage(message)->paused);
783+
auto& priHeader = message.getHeaders().getSingleOrEmpty(HTTP_HEADER_PRIORITY);
784+
EXPECT_EQ("u=7,p", priHeader);
785+
}
786+
779787
TEST(HTTPHeaders, GetSetOnResize) {
780788
HTTPHeaders headers;
781789
for (size_t i = 0; i < kInitialVectorReserve - 1; i++) {

‎proxygen/lib/http/test/HTTPPriorityFunctionsTest.cpp

+24-3
Original file line numberDiff line numberDiff line change
@@ -94,12 +94,12 @@ TEST(HTTPPriorityFunctionsTest, PriorityHeaderUrgencyAndIncrementalUppercase) {
9494

9595
TEST(HTTPPriorityFunctionsTest, PriorityHeaderBadUrgency) {
9696
HTTPMessage req;
97-
req.getHeaders().add(HTTP_HEADER_PRIORITY, "p=3");
97+
req.getHeaders().add(HTTP_HEADER_PRIORITY, "x=3");
9898
auto priority = httpPriorityFromHTTPMessage(req);
9999
EXPECT_FALSE(priority.hasValue());
100100

101101
// same as above but with incremental flag
102-
req.getHeaders().set(HTTP_HEADER_PRIORITY, "p=2, i");
102+
req.getHeaders().set(HTTP_HEADER_PRIORITY, "x=2, i");
103103
priority = httpPriorityFromHTTPMessage(req);
104104
// default to u=3 if urgency is missing but incremental is present
105105
ASSERT_TRUE(priority.hasValue());
@@ -122,13 +122,20 @@ TEST(HTTPPriorityFunctionsTest, PriorityHeaderBadUrgency) {
122122
EXPECT_FALSE(priority.hasValue());
123123
}
124124

125-
TEST(HTTPPriorityFunctionsTest, PriorityHeaderBadPriority) {
125+
TEST(HTTPPriorityFunctionsTest, PriorityHeaderBadIncremental) {
126126
HTTPMessage req;
127127
req.getHeaders().add(HTTP_HEADER_PRIORITY, "u=3, i=0");
128128
auto priority = httpPriorityFromHTTPMessage(req);
129129
EXPECT_FALSE(priority.hasValue());
130130
}
131131

132+
TEST(HTTPPriorityFunctionsTest, PriorityHeaderBadPaused) {
133+
HTTPMessage req;
134+
req.getHeaders().add(HTTP_HEADER_PRIORITY, "u=3, p=0");
135+
auto priority = httpPriorityFromHTTPMessage(req);
136+
EXPECT_FALSE(priority.hasValue());
137+
}
138+
132139
TEST(HTTPPriorityFunctionsTest, PriorityHeaderDefaultOrderId) {
133140
HTTPMessage req;
134141
req.getHeaders().add(HTTP_HEADER_PRIORITY, "u=3");
@@ -143,3 +150,17 @@ TEST(HTTPPriorityFunctionsTest, PriorityHeaderCustomOrderId) {
143150
EXPECT_EQ(priority->urgency, 3);
144151
EXPECT_EQ(priority->orderId, 100);
145152
}
153+
154+
TEST(HTTPPriorityFunctionsTest, PriorityHeaderDefaultUnpaused) {
155+
HTTPMessage req;
156+
req.getHeaders().add(HTTP_HEADER_PRIORITY, "u=3");
157+
auto priority = httpPriorityFromHTTPMessage(req);
158+
EXPECT_FALSE(priority->paused);
159+
}
160+
161+
TEST(HTTPPriorityFunctionsTest, PriorityHeaderPaused) {
162+
HTTPMessage req;
163+
req.getHeaders().add(HTTP_HEADER_PRIORITY, "u=3, p");
164+
auto priority = httpPriorityFromHTTPMessage(req);
165+
EXPECT_TRUE(priority->paused);
166+
}

0 commit comments

Comments
 (0)
Please sign in to comment.