Skip to content

Commit 9f19de6

Browse files
Joanna Jofacebook-github-bot
Joanna Jo
authored andcommitted
Add WebTransportFilter
Summary: Adding the skeleton of the WebTransport filter. Planning on filling this out iteratively, starting from the capsule callback overrides. Reviewed By: afrind Differential Revision: D74439776 fbshipit-source-id: 458b3424ab9e38ff06993b367bc74c1911817ae7
1 parent 4d3082a commit 9f19de6

File tree

1 file changed

+202
-0
lines changed

1 file changed

+202
-0
lines changed
Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,202 @@
1+
/*
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
* All rights reserved.
4+
*
5+
* This source code is licensed under the BSD-style license found in the
6+
* LICENSE file in the root directory of this source tree.
7+
*/
8+
9+
#pragma once
10+
11+
#include <folly/logging/xlog.h>
12+
#include <proxygen/lib/http/HTTPMessageFilters.h>
13+
#include <proxygen/lib/http/codec/webtransport/WebTransportCapsuleCodec.h>
14+
#include <proxygen/lib/http/session/HTTPTransaction.h>
15+
#include <proxygen/lib/http/webtransport/WebTransport.h>
16+
17+
namespace proxygen {
18+
19+
/**
20+
* WebTransportFilter class definition.
21+
*
22+
* HTTPSession/HQSession will install this filter on a WebTransport transaction.
23+
* The filter holds some session state like the flow controller. The onBody
24+
* callbacks will pass in the ingress to the
25+
* H2WebTransportCodec/H3WebTransportCodec, which then call the appropriate
26+
* capsule callbacks.
27+
*/
28+
class WebTransportFilter
29+
: public HTTPMessageFilter
30+
, public WebTransportImpl::TransportProvider
31+
, public HTTPTransactionTransportCallback
32+
, public WebTransportCapsuleCodec::Callback {
33+
public:
34+
explicit WebTransportFilter(HTTPTransaction* txn, CodecVersion version)
35+
: txn_(txn) {
36+
codec_ = std::make_unique<WebTransportCapsuleCodec>(this, version);
37+
txn_->setWTTransportProvider(
38+
static_cast<WebTransportImpl::TransportProvider*>(this));
39+
txn_->setTransportCallback(
40+
static_cast<HTTPTransactionTransportCallback*>(this));
41+
if (txn->isDownstream()) {
42+
nextNewWTBidiStream_++;
43+
nextNewWTUniStream_++;
44+
}
45+
}
46+
47+
void clearTransaction() {
48+
txn_ = nullptr;
49+
}
50+
51+
void onBody(std::unique_ptr<folly::IOBuf> chain) noexcept override {
52+
codec_->onIngress(std::move(chain), false);
53+
}
54+
55+
void onEOM() noexcept override {
56+
codec_->onIngress(nullptr, true);
57+
}
58+
59+
void trackedByteEventTX(const ByteEvent& event) noexcept override {
60+
}
61+
void firstHeaderByteFlushed() noexcept override {
62+
}
63+
void firstByteFlushed() noexcept override {
64+
}
65+
void lastByteFlushed() noexcept override {
66+
}
67+
void lastByteAcked(std::chrono::milliseconds latency) noexcept override {
68+
}
69+
void headerBytesGenerated(HTTPHeaderSize& size) noexcept override {
70+
}
71+
void headerBytesReceived(const HTTPHeaderSize& size) noexcept override {
72+
}
73+
void bodyBytesGenerated(size_t nbytes) noexcept override {
74+
}
75+
void bodyBytesReceived(size_t size) noexcept override {
76+
}
77+
78+
folly::Expected<folly::Unit, WebTransport::ErrorCode> sendDatagram(
79+
std::unique_ptr<folly::IOBuf> datagram) override {
80+
return folly::unit;
81+
}
82+
83+
folly::Expected<HTTPCodec::StreamID, WebTransport::ErrorCode>
84+
newWebTransportBidiStream() override {
85+
// TODO: Flow control
86+
auto res = nextNewWTBidiStream_;
87+
nextNewWTBidiStream_ += 4;
88+
return res;
89+
}
90+
91+
folly::Expected<HTTPCodec::StreamID, WebTransport::ErrorCode>
92+
newWebTransportUniStream() override {
93+
// TODO: Flow control
94+
auto res = nextNewWTUniStream_;
95+
nextNewWTUniStream_ += 4;
96+
return res;
97+
}
98+
99+
folly::Expected<WebTransport::FCState, WebTransport::ErrorCode>
100+
sendWebTransportStreamData(HTTPCodec::StreamID id,
101+
std::unique_ptr<folly::IOBuf> data,
102+
bool eof,
103+
WebTransport::ByteEventCallback* wcb) override {
104+
return WebTransport::FCState::UNBLOCKED;
105+
}
106+
107+
folly::Expected<folly::Unit, WebTransport::ErrorCode> resetWebTransportEgress(
108+
HTTPCodec::StreamID id, uint32_t errorCode) override {
109+
return folly::unit;
110+
}
111+
112+
folly::Expected<folly::Unit, WebTransport::ErrorCode>
113+
setWebTransportStreamPriority(HTTPCodec::StreamID id,
114+
HTTPPriority pri) override {
115+
return folly::unit;
116+
}
117+
118+
folly::Expected<std::pair<std::unique_ptr<folly::IOBuf>, bool>,
119+
WebTransport::ErrorCode>
120+
readWebTransportData(HTTPCodec::StreamID id, size_t max) override {
121+
return folly::makeUnexpected(WebTransport::ErrorCode::GENERIC_ERROR);
122+
}
123+
124+
folly::Expected<folly::Unit, WebTransport::ErrorCode>
125+
initiateReadOnBidiStream(HTTPCodec::StreamID id,
126+
quic::StreamReadCallback* readCallback) override {
127+
return folly::unit;
128+
}
129+
130+
folly::Expected<folly::Unit, WebTransport::ErrorCode>
131+
pauseWebTransportIngress(HTTPCodec::StreamID id) override {
132+
return folly::unit;
133+
}
134+
135+
folly::Expected<folly::Unit, WebTransport::ErrorCode>
136+
resumeWebTransportIngress(HTTPCodec::StreamID id) override {
137+
return folly::unit;
138+
}
139+
140+
folly::Expected<folly::Unit, WebTransport::ErrorCode>
141+
stopReadingWebTransportIngress(HTTPCodec::StreamID id,
142+
folly::Optional<uint32_t> errorCode) override {
143+
return folly::unit;
144+
}
145+
146+
void onWTResetStreamCapsule(WTResetStreamCapsule capsule) override {
147+
XLOG(DBG1) << __func__;
148+
}
149+
void onWTStopSendingCapsule(WTStopSendingCapsule capsule) override {
150+
XLOG(DBG1) << __func__;
151+
}
152+
void onWTStreamCapsule(WTStreamCapsule capsule) override {
153+
XLOG(DBG1) << __func__;
154+
}
155+
void onWTMaxDataCapsule(WTMaxDataCapsule capsule) override {
156+
XLOG(DBG1) << __func__;
157+
}
158+
void onWTMaxStreamDataCapsule(WTMaxStreamDataCapsule capsule) override {
159+
XLOG(DBG1) << __func__;
160+
}
161+
void onWTMaxStreamsCapsule(WTMaxStreamsCapsule capsule) override {
162+
XLOG(DBG1) << __func__;
163+
}
164+
void onWTDataBlockedCapsule(WTDataBlockedCapsule capsule) override {
165+
XLOG(DBG1) << __func__;
166+
}
167+
void onWTStreamDataBlockedCapsule(
168+
WTStreamDataBlockedCapsule capsule) override {
169+
XLOG(DBG1) << __func__;
170+
}
171+
void onWTStreamsBlockedCapsule(WTStreamsBlockedCapsule capsule) override {
172+
XLOG(DBG1) << __func__;
173+
}
174+
void onDatagramCapsule(DatagramCapsule capsule) override {
175+
XLOG(DBG1) << __func__;
176+
}
177+
void onCloseWebTransportSessionCapsule(
178+
CloseWebTransportSessionCapsule capsule) override {
179+
XLOG(DBG1) << __func__;
180+
}
181+
void onDrainWebTransportSessionCapsule(
182+
DrainWebTransportSessionCapsule capsule) override {
183+
XLOG(DBG1) << __func__;
184+
}
185+
186+
private:
187+
HTTPTransaction* txn_;
188+
std::unique_ptr<CapsuleCodec> codec_;
189+
uint64_t nextNewWTBidiStream_{0};
190+
uint64_t nextNewWTUniStream_{2};
191+
uint64_t bodyOffset_{0};
192+
folly::F14FastMap<HTTPCodec::StreamID, WebTransportImpl::StreamReadHandle*>
193+
readCallbacks_;
194+
struct WriteCallback {
195+
HTTPCodec::StreamID id;
196+
uint64_t bodyOffset;
197+
quic::StreamWriteCallback* wcb;
198+
};
199+
std::list<WriteCallback> writeCallbacks_;
200+
};
201+
202+
} // namespace proxygen

0 commit comments

Comments
 (0)