diff --git a/proxygen/lib/http/codec/SettingsId.h b/proxygen/lib/http/codec/SettingsId.h index 374905bde3..50328ab8b6 100644 --- a/proxygen/lib/http/codec/SettingsId.h +++ b/proxygen/lib/http/codec/SettingsId.h @@ -55,7 +55,7 @@ enum class SettingsId : uint64_t { _HQ_DATAGRAM_DRAFT_8 = HQ_SETTINGS_MASK | 0xffd277, _HQ_DATAGRAM_RFC = HQ_SETTINGS_MASK | 0x33, ENABLE_WEBTRANSPORT = 0x2b603742, - WEBTRANSPORT_MAX_SESSIONS = 0x2b603743 + WEBTRANSPORT_MAX_SESSIONS = 0xc671706a }; using SettingPair = std::pair; diff --git a/proxygen/lib/http/session/HQSession.cpp b/proxygen/lib/http/session/HQSession.cpp index cb9a30ee2a..268e1ffdca 100644 --- a/proxygen/lib/http/session/HQSession.cpp +++ b/proxygen/lib/http/session/HQSession.cpp @@ -1538,6 +1538,9 @@ void HQSession::applySettings(const SettingsList& settings) { supportsWebTransport_.set(folly::to_underlying(SettingEnabled::PEER)); break; case hq::SettingId::WEBTRANSPORT_MAX_SESSIONS: + hasWT = setting.value > 0; + VLOG(3) << "Peer sent WEBTRANSPORT_MAX_SESSIONS: " << uint32_t(hasWT); + supportsWebTransport_.set(folly::to_underlying(SettingEnabled::PEER)); break; } } @@ -2559,6 +2562,11 @@ void HQSession::HQStreamTransportBase::onHeadersComplete( observer->requestStarted(observed, event); }); } + if (WebTransport::isConnectMessage(*msg)) { + VLOG(3) << "Peer sent WT Connect"; + session_.supportsWebTransport_.set( + folly::to_underlying(SettingEnabled::PEER)); + } } if (!txn_.getHandler()) { diff --git a/proxygen/lib/http/session/test/HQDownstreamSessionTest.cpp b/proxygen/lib/http/session/test/HQDownstreamSessionTest.cpp index debacdc0c0..4b1df5c9b9 100644 --- a/proxygen/lib/http/session/test/HQDownstreamSessionTest.cpp +++ b/proxygen/lib/http/session/test/HQDownstreamSessionTest.cpp @@ -3354,3 +3354,40 @@ INSTANTIATE_TEST_SUITE_P(HQDownstreamSessionTest, return tp; }()), paramsToTestName); + +class HQDownstreamSessionTestWebTransport : public HQDownstreamSessionTest {}; + +TEST_P(HQDownstreamSessionTestWebTransport, WTRequestNegotiates) { + HTTPMessage req; + req.setHTTPVersion(1, 1); + req.setUpgradeProtocol("webtransport"); + req.setMethod(HTTPMethod::CONNECT); + req.setURL("/webtransport"); + req.getHeaders().set(HTTP_HEADER_HOST, "www.facebook.com"); + auto sessionId = sendRequest(req, false); + auto handler = addSimpleStrictHandler(); + handler->expectHeaders(); + flushRequestsAndLoopN(3); + + HTTPMessage resp; + resp.setStatusCode(200); + handler->txn_->sendHeaders(resp); + EXPECT_NE(handler->txn_->getWebTransport(), nullptr); + handler->sendEOM(); + handler->expectEOM(); + handler->expectDetachTransaction(); + socketDriver_->addReadEOF(sessionId, std::chrono::milliseconds(0)); + hqSession_->closeWhenIdle(); + flushRequestsAndLoop(); +} + +INSTANTIATE_TEST_SUITE_P(HQDownstreamSessionTest, + HQDownstreamSessionTestWebTransport, + Values([] { + TestParams tp; + tp.alpn_ = "h3"; + tp.shouldSendSettings_ = false; + tp.webTransport_ = true; + return tp; + }()), + paramsToTestName);