Skip to content

Commit

Permalink
Refresh WebTransport connect stream timeout
Browse files Browse the repository at this point in the history
Summary:
Any activity on the WebTransport session should extend its timeout -

* new streams
* new data on streams
* writing data to streams
* stream errors
* datagrams

Reviewed By: mjoras

Differential Revision: D51443713

fbshipit-source-id: f306219cff0f3dea54573c576b3d29fac295cf5a
  • Loading branch information
afrind authored and facebook-github-bot committed Nov 27, 2023
1 parent 605d0d7 commit e764cb3
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 1 deletion.
4 changes: 4 additions & 0 deletions proxygen/lib/http/session/HTTPTransaction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1499,6 +1499,7 @@ folly::Expected<HTTPTransaction::Transport::FCState, WebTransport::ErrorCode>
HTTPTransaction::sendWebTransportStreamData(HTTPCodec::StreamID id,
std::unique_ptr<folly::IOBuf> data,
bool eof) {
refreshTimeout();
auto res = transport_.sendWebTransportStreamData(id, std::move(data), eof);
if (eof || res.hasError()) {
wtEgressStreams_.erase(id);
Expand Down Expand Up @@ -1903,6 +1904,7 @@ void HTTPTransaction::onWebTransportBidiStream(HTTPCodec::StreamID id) {
transport_.stopReadingWebTransportIngress(id, WebTransport::kInternalError);
return;
}
refreshTimeout();
auto ingRes = wtIngressStreams_.emplace(std::piecewise_construct,
std::forward_as_tuple(id),
std::forward_as_tuple(*this, id));
Expand All @@ -1922,6 +1924,7 @@ void HTTPTransaction::onWebTransportUniStream(HTTPCodec::StreamID id) {
transport_.stopReadingWebTransportIngress(id, WebTransport::kInternalError);
return;
}
refreshTimeout();
auto ingRes = wtIngressStreams_.emplace(std::piecewise_construct,
std::forward_as_tuple(id),
std::forward_as_tuple(*this, id));
Expand Down Expand Up @@ -2005,6 +2008,7 @@ void HTTPTransaction::TxnStreamReadHandle::error(uint32_t error) {

void HTTPTransaction::onWebTransportStreamIngress(
HTTPCodec::StreamID id, std::unique_ptr<folly::IOBuf> data, bool eof) {
refreshTimeout();
auto ingressStreamIt = wtIngressStreams_.find(id);
CHECK(ingressStreamIt != wtIngressStreams_.end());
auto fcState = ingressStreamIt->second.dataAvailable(std::move(data), eof);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,14 @@ class HTTPTransactionWebTransportTest : public testing::Test {
req.setURL("/webtransport");
req.getHeaders().set(HTTP_HEADER_HOST, "www.facebook.com");
txn_->sendHeaders(req);
auto resp = std::make_unique<HTTPMessage>();
resp->setHTTPVersion(1, 1);
resp->setStatusCode(200);
if (withHandler) {
handler_.expectHeaders();
}
txn_->onIngressHeadersComplete(std::move(resp));

wt_ = txn_->getWebTransport();
EXPECT_NE(wt_, nullptr);
}
Expand Down Expand Up @@ -89,10 +97,12 @@ class HTTPTransactionWebTransportTest : public testing::Test {
HTTPCodec::StreamID(1),
0,
transport_,
txnEgressQueue_);
txnEgressQueue_,
&evb_.timer());
return *txn_;
}
WebTransport* wt_{nullptr};
folly::EventBase evb_;
};

TEST_F(HTTPTransactionWebTransportTest, CreateStreams) {
Expand Down Expand Up @@ -438,4 +448,31 @@ TEST_F(HTTPTransactionWebTransportTest, SendDatagram) {
EXPECT_TRUE(wt_->sendDatagram(makeBuf(100)));
}

TEST_F(HTTPTransactionWebTransportTest, RefreshTimeout) {
txn_->setIdleTimeout(std::chrono::milliseconds(100));
evb_.runAfterDelay(
[this] {
WebTransport::StreamReadHandle* readHandle{nullptr};
EXPECT_CALL(handler_, onWebTransportUniStream(_, _))
.WillOnce(SaveArg<1>(&readHandle));

txn_->onWebTransportUniStream(0);
EXPECT_NE(readHandle, nullptr);
},
50);
evb_.runAfterDelay(
[this] {
EXPECT_CALL(transport_,
stopReadingWebTransportIngress(
0, std::numeric_limits<uint32_t>::max()))
.WillOnce(Return(folly::unit));
handler_.expectEOM();
txn_->onIngressEOM();
EXPECT_CALL(transport_, sendEOM(txn_.get(), nullptr));
wt_->closeSession();
},
150);
evb_.loop();
}

} // namespace proxygen::test

0 comments on commit e764cb3

Please sign in to comment.