Skip to content

Commit fb3ddce

Browse files
Yang Chifacebook-github-bot
Yang Chi
authored andcommitted
HQSession calling into transport to update priority
Summary: Make the priority update cross layer Reviewed By: mjoras Differential Revision: D24369945 fbshipit-source-id: 8dd6bf012484ebc888f2d1e7f64bc4e9284f7e6f
1 parent 4d153c2 commit fb3ddce

File tree

3 files changed

+69
-9
lines changed

3 files changed

+69
-9
lines changed

proxygen/lib/http/session/HQSession.cpp

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2585,6 +2585,16 @@ void HQSession::HQStreamTransportBase::onHeadersComplete(
25852585
session_.scheduleLoopCallback();
25862586
}
25872587

2588+
auto timeDiff = std::chrono::duration_cast<std::chrono::milliseconds>(
2589+
std::chrono::steady_clock::now() - createdTime);
2590+
auto sock = session_.sock_;
2591+
auto streamId = getStreamId();
2592+
if (sock && sock->getState() && sock->getState()->qLogger) {
2593+
sock->getState()->qLogger->addStreamStateUpdate(
2594+
streamId, quic::kOnHeaders, timeDiff);
2595+
}
2596+
sock->setStreamPriority(streamId, msg->getPriority(), msg->getIncremental());
2597+
25882598
// Tell the HTTPTransaction to start processing the message now
25892599
// that the full ingress headers have arrived.
25902600
// Depending on the push promise latch, the message is delivered to
@@ -2597,15 +2607,6 @@ void HQSession::HQStreamTransportBase::onHeadersComplete(
25972607
} else {
25982608
txn_.onIngressHeadersComplete(std::move(msg));
25992609
}
2600-
2601-
auto timeDiff = std::chrono::duration_cast<std::chrono::milliseconds>(
2602-
std::chrono::steady_clock::now() - createdTime);
2603-
auto sock = session_.sock_;
2604-
auto streamId = getStreamId();
2605-
if (sock && sock->getState() && sock->getState()->qLogger) {
2606-
sock->getState()->qLogger->addStreamStateUpdate(
2607-
streamId, quic::kOnHeaders, timeDiff);
2608-
}
26092610
}
26102611

26112612
void HQSession::HQStreamTransportBase::transactionTimeout(
@@ -2774,6 +2775,8 @@ void HQSession::HQStreamTransportBase::sendHeaders(HTTPTransaction* txn,
27742775
streamId, quic::kEOM, timeDiff);
27752776
}
27762777
}
2778+
sock->setStreamPriority(
2779+
streamId, headers.getPriority(), headers.getIncremental());
27772780

27782781
// If partial reliability is enabled, enable the callbacks.
27792782
if (session_.isPartialReliabilityEnabled() && headers.isPartiallyReliable()) {

proxygen/lib/http/session/test/HQDownstreamSessionTest.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,15 @@ using HQDownstreamSessionTestHQPrSkips = HQDownstreamSessionTest;
5252
// Use this test class for h3 server push tests
5353
using HQDownstreamSessionTestHQPush = HQDownstreamSessionTest;
5454

55+
namespace {
56+
HTTPMessage getProgressiveGetRequest() {
57+
auto req = proxygen::getGetRequest();
58+
req.getHeaders().add(HTTP_HEADER_PRIORITY, "u=1, i");
59+
updateMessagePriorityFromPriorityString(req);
60+
return req;
61+
}
62+
} // namespace
63+
5564
HTTPCodec::StreamID HQDownstreamSessionTest::sendRequest(const std::string& url,
5665
int8_t priority,
5766
bool eom) {
@@ -326,6 +335,28 @@ TEST_P(HQDownstreamSessionTest, SimpleGet) {
326335
hqSession_->closeWhenIdle();
327336
}
328337

338+
TEST_P(HQDownstreamSessionTest, PriorityUpdateIntoTransport) {
339+
if (!IS_HQ) { // H1Q tests do not support priority
340+
hqSession_->closeWhenIdle();
341+
return;
342+
}
343+
auto request = getProgressiveGetRequest();
344+
sendRequest(request);
345+
auto handler = addSimpleStrictHandler();
346+
EXPECT_CALL(*socketDriver_->getSocket(), setStreamPriority(_, 1, true));
347+
handler->expectHeaders();
348+
handler->expectEOM([&]() {
349+
auto resp = makeResponse(200, 0);
350+
std::get<0>(resp)->getHeaders().add(HTTP_HEADER_PRIORITY, "u=2");
351+
updateMessagePriorityFromPriorityString(*std::get<0>(resp), "u=2");
352+
EXPECT_CALL(*socketDriver_->getSocket(), setStreamPriority(_, 2, false));
353+
handler->sendRequest(*std::get<0>(resp));
354+
});
355+
handler->expectDetachTransaction();
356+
flushRequestsAndLoop();
357+
hqSession_->closeWhenIdle();
358+
}
359+
329360
TEST_P(HQDownstreamSessionTest, GetStopSending) {
330361
auto id = sendRequest(getGetRequest());
331362
auto handler = addSimpleStrictHandler();

proxygen/lib/http/session/test/HQUpstreamSessionTest.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
*/
88

99
#include <proxygen/lib/http/session/test/HQUpstreamSessionTest.h>
10+
#include <proxygen/lib/http/codec/CodecUtil.h>
1011
#include <proxygen/lib/http/session/HQUpstreamSession.h>
1112

1213
#include <folly/futures/Future.h>
@@ -328,6 +329,31 @@ TEST_P(HQUpstreamSessionTest, SimpleGet) {
328329
hqSession_->closeWhenIdle();
329330
}
330331

332+
TEST_P(HQUpstreamSessionTest, PriorityUpdateIntoTransport) {
333+
if (IS_HQ) {
334+
auto handler = openTransaction();
335+
auto req = getGetRequest();
336+
req.getHeaders().add(HTTP_HEADER_PRIORITY, "u=3, i");
337+
updateMessagePriorityFromPriorityString(req);
338+
EXPECT_CALL(*socketDriver_->getSocket(), setStreamPriority(_, 3, true));
339+
handler->txn_->sendHeadersWithEOM(req);
340+
341+
handler->expectHeaders();
342+
handler->expectBody();
343+
handler->expectEOM();
344+
handler->expectDetachTransaction();
345+
auto resp = makeResponse(200, 100);
346+
std::get<0>(resp)->getHeaders().add(HTTP_HEADER_PRIORITY, "u=5");
347+
sendResponse(handler->txn_->getID(),
348+
*std::get<0>(resp),
349+
std::move(std::get<1>(resp)),
350+
true);
351+
EXPECT_CALL(*socketDriver_->getSocket(), setStreamPriority(_, 5, false));
352+
flushAndLoop();
353+
}
354+
hqSession_->closeWhenIdle();
355+
}
356+
331357
TEST_P(HQUpstreamSessionTest, NoNewTransactionIfSockIsNotGood) {
332358
socketDriver_->sockGood_ = false;
333359
EXPECT_EQ(hqSession_->newTransaction(nullptr), nullptr);

0 commit comments

Comments
 (0)