1
0
mirror of https://github.com/facebook/proxygen.git synced 2026-10-24 01:33:54 +03:00

15601 Commits

Author SHA1 Message Date
Neil Spring
43d56bc35f Use getdeps absl for the rdma-unit suite
Summary:
The rdma-unit suite fetched its own Abseil with CMake FetchContent. It now uses the getdeps `absl` project: platforms with a new-enough distro package install it instead of compiling from source, and source builds stay pinned to the same rev so the built code is unchanged.

No functional change intended. Only the test variant's Abseil sourcing changes.

- Drop the test-conditional `glog` entry, an exact duplicate of the unconditional one (`metaroce`).

Reviewed By: bsorrells

Differential Revision: D125553093

fbshipit-source-id: 0188b551824e698a64587fe8d837aabc15f2f869
2026-10-23 12:38:11 -07:00
Neil Spring
1cc8ee8465 getdeps: Fix shared libfolly link in no-system-packages builds
Summary:
Fix the `oss-metaroce-linux-getdeps` continuous job, which fails when linking shared `libfolly.so` because source-built `libevent`, `zlib`, and `libaio` produce only static archives without position-independent code.

Enable PIC for `zlib` and `libevent` (consistent with other manifests), and switch `libaio` to produce shared libraries so folly can link against them. Add a regression test that guards against these link inputs silently reverting.

Re-enabling shared `libaio` was previously reverted (D93644345) but verified safe via a no-system-packages moxygen build. Blast radius is narrow: only `folly` and `cachelib` consume source-built libaio, and only `metaroce`/`rebalancer(-explorer)` request shared folly.

Reviewed By: bigfootjon

Differential Revision: D126978432

fbshipit-source-id: 56c67f890e2f99ecd3ae800f82adba71e475bcf9
2026-10-23 10:57:18 -07:00
Darrin D'Mello
e80cd91c19 Call out freeing an acceptor before its forceStop() runs
Summary:
`forceStop()` only queues the drop of an acceptor's connections on its EventBase, even when called on that thread, so freeing the acceptor right after it is a use-after-free. [`ServiceWorker::drainServiceAcceptor`](https://www.internalfb.com/code/fbsource/[master]/fbcode/proxygen/lib/services/ServiceWorker.h) does that when it evicts a previously-draining acceptor, though no caller reaches that branch today: the hot-reload rebind from D116582982 releases every draining acceptor before draining its address again.

Flag the branch with a FIXME, spell out the free-a-loop-later duty `releaseDrainingAcceptor()` hands its caller, and note why `clearAcceptors()` does not force-stop and what the uncalled `clearDrainingAcceptors()` is for. Also correct the [RevProxy worker reference](https://www.internalfb.com/code/fbsource/[master]/fbcode/proxygen/facebook/revproxy/.llms/skills/revproxy/references/core/HTTPRevProxyWorker.md), which still says the VIP-swap helpers have no callers, and the `prepareVipSocketSwap` comment, which still relies on that eviction. There is no behavior change.

Reviewed By: DavidLu1997

Differential Revision: D120071479

fbshipit-source-id: fc208f77ecaf7385da2baee3c6628251c99cf9ac
2026-10-23 09:11:35 -07:00
Darrin D'Mello
ff985ae54a Test that the final goaway suppresses new streams
Summary:
The double-goaway drain's whole point is that the first goaway advertises `lastStream = max` and refuses nothing, while the second pins `lastStream` to what the server has already seen and lowers `egressGoawayAck_`, after which `HTTPParallelCodec::deliverCallbackIfAllowed` drops the ingress callbacks for anything above it. That second half had no coverage: `DoubleGoaway` asserts the `isStreamIngressEgressAllowed` predicate flips but never parses a stream through it, `GoawayHandling` covers real suppression only for a push stream after a single goaway, and the session-level tests assert goaway emission with nothing sent afterwards.

Open a stream after each goaway and assert the first is served and the second is not. Also assert the refused one produces no stream or session error -- it is silently ignored, which is what callers depending on this drain need to know.

___

landed-with-radar-review

Differential Revision: D120071478

fbshipit-source-id: 4a5757df9e39c48b837851e938e72230554c13d3
2026-10-23 03:20:38 -07:00
Ido Shoshani
4996505459 Let a stream callback close the session at conn end
Summary:
When the QUIC connection ends, `QuicWebTransport::onConnectionEndImpl` runs `destroy()`, which cancels each write stream and then resets it. Cancellation callbacks run synchronously, and the app may close the session from one. A MoQ relay does after it has sent GOAWAY: the peer's close cancels the last request stream, so `MoQSession` drains and calls `close()`, which calls `closeSession()` (clearing `quicSocket_`) and drops the last reference to the transport. The loop then resets the next stream on a freed object; non-ASAN builds read a null `quicSocket_` there and abort on `XCHECK(quicSocket_)` (T292108050).

- `WebTransportImpl` is a `folly::DestructorCheck`. Once the transport is destroyed, the egress loop stops touching it (the remaining handles still get `onStopSending`), and `onConnectionEndImpl` returns right after `destroy()`.
- If the app only closes the session, `resetWebTransportEgress` returns an error instead of `XCHECK`ing, as `stopReadingWebTransportIngress` already does, and `isPeerInitiatedStream` returns false.

The connection has already ended, so the skipped resets were no-ops.

Reviewed By: JunqiWang

Differential Revision: D126530616

fbshipit-source-id: 453368bca60ad8f0c75926783269af0c0d25606d
2026-10-22 21:10:15 -07:00
Genevieve (Genna) Helsel
2498135dc3 RustStaticLibrary: accept ENV in rust_static_library too
Summary:
D125255421 gave `rust_executable()` an `ENV` list of variables to set for `cargo build`, but `rust_static_library()` doesn't have one, so a project can't give a static library's cargo build the same settings. eden needs both of its cargo builds to see the thrift compiler and thrift files it builds with, which D125301420 passes through `ENV`.

___

landed-with-radar-review

Differential Revision: D125301419

fbshipit-source-id: 26475db4897366e92206d622a5c6287bc39bd0dd
2026-10-22 18:34:30 -07:00
Genevieve (Genna) Helsel
1b52a9bfc3 FBThriftPythonLibrary: link every thrift subpackage into executables, accept installed thrift files
Summary:
`add_fb_thrift_python_executable()` creates a regular `thrift` package in the executable and links only `thrift/python` into it. That hides the rest of the wheel's namespace package, and `thrift.python.client` can't import `thrift.py3`, so every thrift-python client fails to import. It now links all of the wheel's `thrift` subpackages.

`add_fbthrift_python_library()` also accepts an absolute thrift file, so a project can generate thrift-python modules from a dependency's installed thrift files. eden uses this for fb303's `fb303_core.thrift`, because fb303 installs only legacy thrift-py modules.

___

landed-with-radar-review

Differential Revision: D125301405

fbshipit-source-id: 0e78e00f2ab97f1989c90db0035446282c4647a2
2026-10-22 18:34:30 -07:00
Muir Manders
ac805755a9 overlay: remove the Sqlite inode catalog
Summary:
Every Windows checkout runs the InMemory inode catalog, which rebuilds the
overlay from the on-disk PrjFS state at mount time, and Linux and macOS
only use the filesystem catalogs. The Sqlite catalog had no production
users left, so remove it along with everything that only existed for it:
the `eden/fs/sqlite` wrapper, `InodeCatalogOptions` (buffered,
synchronous-off and unsafe-in-memory were all Sqlite modes), the
`overlay:buffered`, `overlay:buffer-size`, `overlay:synchronous-mode`,
`overlay:unsafe-in-memory-overlay` and `overlay:maintenance-interval`
settings, the periodic overlay maintenance task that ran the Sqlite WAL
checkpoint, the `sqlite_integrity_check` telemetry event, the sqlite3
dependency of the OSS build, and the Windows integration tests that
corrupted or deleted `treestore.db`.

A Windows checkout whose config still names `sqlite` falls back to the
InMemory default, which is what the CLI migration had been converting such
checkouts to on every `eden start`; that migration goes away too. The
removed config keys join `DeadConfigKeys` so the daemon stays quiet while
configerator still sets them.

WindowsFsck no longer needs to know the catalog type: the only catalog on
Windows never has a persisted root directory, so it always scans.

The Python CLI now keeps an `inode-catalog-type` it does not recognize
instead of treating the checkout config as corrupted, so `eden rm`,
`eden list` and `eden doctor` keep working on a Sqlite or LMDB checkout
that the daemon refuses to mount; only `eden clone` validates the type.

Reviewed By: genevievehelsel

Differential Revision: D125689731

fbshipit-source-id: 2a0a71dc3c2006f877ec95148d38438d34eb0899
2026-10-22 17:29:13 -07:00
Muir Manders
d14b9c0505 overlay: remove the LMDB inode catalog
Summary:
The LMDB overlay was an experiment gated behind the `eden_lmdb_overlay`
gatekeeper, which is at 0%. In the last 30 days of `edenfs_events` mount
events only two devservers mounted an LMDB overlay. Remove the catalog,
its file content store, the `eden/fs/lmdb` wrapper, and the OSS build
plumbing (`EDEN_HAVE_LMDB`, the getdeps manifest, the CMake find module).

With a single kind of file content store left, `FileContentStore` and
`OverlayFile` wrap a plain `folly::File` instead of a
`std::variant<folly::File, InodeNumber>`, and the preallocation thread no
longer needs to probe whether the store hands back file descriptors.

On Linux and macOS the Sqlite catalog stored file contents in LMDB. That
configuration has no supported use, so `Overlay::create` now rejects
Sqlite off Windows the same way it rejects InMemory, and the Sqlite
catalog unit test is Windows-only.

A checkout config naming a catalog type the daemon no longer knows used to
fall back silently to the default catalog. For an LMDB overlay directory
that means opening it as a legacy overlay and letting fsck discard its
contents. On Linux and macOS loading such a config now fails with an error
asking for a reclone. Windows keeps the fallback because its overlay is
rebuilt from the on-disk PrjFS state.

The configerator `lmdb_overlay` rollout is removed separately.

Reviewed By: genevievehelsel

Differential Revision: D125689728

fbshipit-source-id: 3084c2893137d42ff4d589d7cab04902412a840b
2026-10-22 17:29:13 -07:00
Genevieve (Genna) Helsel
2e440d42b1 RustStaticLibrary: add PACKAGE and ENV arguments
Summary:
`rust_static_library()` passes the crate name to `cargo build -p`, so it can't build a crate whose package has another name, like the `edenfs_staticlib` crate in the `edenfs-staticlib` package that D125301398 adds. The new `PACKAGE` argument names the package and defaults to the crate name.

`rust_executable()` gains `ENV`, a list of `NAME=VALUE` pairs for the `cargo build` environment. eden uses it to tell `curl-sys` when getdeps' libcurl is a static library.

Reviewed By: bigfootjon

Differential Revision: D125255421

fbshipit-source-id: db7ca288cc38d491b378b8c71575a6995aa5af8a
2026-10-22 16:56:04 -07:00
Genevieve (Genna) Helsel
6bebb3a8d6 eden: pass the test setting to cmake as BUILD_TESTS
Summary: eden builds its tests only with `BUILD_TESTS`, an option that D125301396 adds later in this stack, off by default. getdeps builds a project's tests unless it gets `--no-tests`, and `build.sh`, `build.bat` and `getdeps.py test eden` rely on that, but eden's manifest has no `[cmake.defines.test=on]` section to pass the setting to cmake, so eden would get no tests. Like folly's, fizz's and wangle's manifests, eden's now sets `BUILD_TESTS=ON` when getdeps builds tests.

Reviewed By: bigfootjon

Differential Revision: D125255420

fbshipit-source-id: ac847928c4807880799c93ab7b93c6aec9ec040c
2026-10-22 16:56:04 -07:00
Genevieve (Genna) Helsel
b96048c1bd eden: mirror lfs_protocol from mononoke/common
Summary:
When getdeps builds eden from an fbsource checkout, it mirrors fbcode into the GitHub layout, and `manifests/eden` keeps only `eden/mononoke/lfs_protocol` out of Mononoke. D88941389 moved that crate to `eden/mononoke/common/lfs_protocol`, so the mirror drops it, Cargo can't load the `eden/scm` workspace (`revisionstore` has a path dependency on it), and configure fails in `rust_cxx_bridge()` with a misleading "does not depend on cxx". The manifest now keeps `common/lfs_protocol` and, like `manifests/sapling`, maps Mononoke's `public_autocargo` Cargo.toml over the internal one.

___

landed-with-radar-review

Differential Revision: D125255417

fbshipit-source-id: 2d2960deb922e551fbc9d50a29dad216081b25ea
2026-10-22 16:56:04 -07:00
Victor Zverovich
05229a96a4 Don't link mvfst into every generated Thrift C++ library
Summary:
`add_fbthrift_cpp_library()`, which fb303, mcrouter, Watchman, Open/R, Mononoke and other projects use for their Thrift files, links every generated library against `mvfst::mvfst_server_async_tran` and `mvfst::mvfst_server`. Nothing in generated code or in `FBThrift::thriftcpp2` uses mvfst: QUIC support lives in `quic_thriftcpp2`, which Thrift does not install. The targets only resolved because `FBThriftConfig.cmake` happened to call `find_package(mvfst)`, so every consumer of the helper needed mvfst.

Remove them. The helper still links `FBThrift::thriftcpp2`, Folly and xxhash. Packages installed with the old helper still name the mvfst targets in their exported link interfaces.

Reviewed By: hchokshi

Differential Revision: D126805090

fbshipit-source-id: 4c8057ec29c56db477454ea32f3c4a565a17cffd
2026-10-22 14:41:36 -07:00
Alan Frindell
17f238bf67 Add a getdeps manifest for haberdashery
Summary: haberdashery now has a CMake build, but getdeps has no way to fetch it, so projects such as mvfst cannot list it as a dependency. This adds a manifest that builds it from GitHub with CMake and skips its tests. It is pinned to the GitHub commit that added the CMake build.

Reviewed By: kvtsoy

Differential Revision: D126960220

fbshipit-source-id: a09a727c824bf48ccd902594cd05c5a683e2f17d
2026-10-22 14:25:57 -07:00
Erin Kramer
503422938c Move StreamDecompressor into decompression
Summary:
**Context:** Group Proxygen decompression classes and helpers in `proxygen::decompression`.

**This diff:** Move `StreamDecompressor` into that namespace and update its live callers across fbsource. Include embedded C++ callers and retain existing include paths.

Differential Revision: D126117913

fbshipit-source-id: 626857cd25c997889bdd83a2ace0e5c854ca8a64
2026-10-22 10:45:49 -07:00
Erin Kramer
ce435f35a9 Move ZstdStreamDecompressor into decompression
Summary:
**Context:** Group Proxygen decompression classes and helpers in `proxygen::decompression`.

**This diff:** Move `ZstdStreamDecompressor` and its associated constants into that namespace and update its live callers across fbsource. Include embedded C++ callers and retain existing include paths.

___

landed-with-radar-review

Differential Revision: D126117909

fbshipit-source-id: e77f003a6b475376187462011b43b05900614c7c
2026-10-22 10:45:49 -07:00
Erin Kramer
c19c392332 Move ZlibStreamDecompressor into decompression
Summary:
**Context:** Group Proxygen decompression classes and helpers in `proxygen::decompression`.

**This diff:** Move `ZlibStreamDecompressor` and its associated constants into that namespace and update its live callers across fbsource. Include embedded C++ callers and retain existing include paths.

Differential Revision: D126117908

fbshipit-source-id: 16c1bc41778169841b2e906606681b2efaf25cbd
2026-10-22 10:45:49 -07:00
Yikai Lin
a6300ef48a Show policy source and content
Summary:
Expose bgpd's loaded ingress/egress policy through `fboss2 show bgp policy`.

- Print `BGP policy` for a separate `--policy` artifact or `BGP config` for embedded policies, followed by the full policy JSON. An optional name selects one statement from the same source.
- Reuse `hasPolicySymlink()`, `getPolicyConfig()`, and `getRunningConfigStruct()`. Fail on an unreadable active artifact instead of falling back, and guard absent statement lists while preserving not-found behavior.
- Preserve split-policy mode in base, DC, and BB config clones so peer updates do not hide the loaded policy.
- Update CLI help/sample output and register query tests in Buck and OSS CMake.
- Request shared glog for BGP/Linux FBOSS and invalidate stale BGP dependency caches.

Differential Revision: D124873983

fbshipit-source-id: 0cb912012a4e678ce5b34f2f6ba29fe507f09eba
2026-10-22 09:53:46 -07:00
Open Source Bot
baa8f909ff Updating hashes
Summary:
GitHub commits:

984013d140
275531cb1f
605b2b8a8d
e89841cb61
00fb3329dc
05d1c685b8
ae3201143f
a39ad07564
8e188013f5
ef988af477
327e167726

Reviewed By: sdwilsh

fbshipit-source-id: 179d30145414eda5afd59bf444fefc91a5e52e33
2026-10-22 09:32:39 -07:00
generatedunixname898294613133534
f60c53d78f Fix CQS signal facebook-hte-CArray in xplat/proxygen/lib/utils
Differential Revision: D120316347

fbshipit-source-id: 831d8aa8a74e0c3808f49508b33c2c3fc901a8db
2026-10-22 08:04:13 -07:00
generatedunixname898294613133534
8f9e53de68 Fix CQS signal facebook-hte-CArray in xplat/proxygen/lib/http
Differential Revision: D119469935

fbshipit-source-id: 074778cb1e21c9e148152b44980cba3f2fd1d0fd
2026-10-22 07:41:52 -07:00
Matt Joras
4f55ce1648 Require an exact QPACK table capacity match for 0-RTT
Summary:
RFC 9204 section 3.2.3: if the client remembers a non-zero `SETTINGS_QPACK_MAX_TABLE_CAPACITY`, the server must send the same value, and the client treats any other value as a connection error. `H3EarlyDataHandler::validate` only required the cached capacity to be at most the current one, so raising the capacity accepted 0-RTT that the client would then fail.

Reject early data when a non-zero cached capacity differs from the current one.

Reviewed By: sharmafb

Differential Revision: D126742446

fbshipit-source-id: e5fd7ee605d7fe3d99fb83c1d1384603b6eaf57c
2026-10-21 20:03:52 -07:00
Matt Joras
b67cee5ee6 Send CANCEL when aborting H2/H3 WebSocket streams
Summary:
Revproxy resets aborted H2/H3 WebSocket streams with `INTERNAL_ERROR`. Following RFC 8441 section 5 and RFC 9220 section 3, send `CANCEL` (`H3_REQUEST_CANCELLED` on H3) instead.

Add `HTTPSink::sendAbort(ErrorCode)` and route the classic handler's client aborts through `sendClientAbort()`, which picks `CANCEL` for H2/HQ requests with an ingress or egress WebSocket upgrade. This covers every abort the handler sends on those requests, not only upstream resets. Plain H2/H3 requests, H1 WebSockets and classic CONNECT are unchanged. D126790939 does the same for `HTTPCoroRevProxyHandler`.

The H2 change is not gated; H3 WebSockets remain gated by `enable_h3_websockets`.

Reviewed By: afrind, lnicco

Differential Revision: D125389662

fbshipit-source-id: f32ba3f7b24bfc9d60cf43f3e0555cfb331a8520
2026-10-21 20:03:52 -07:00
Victor Zverovich
dc9f6ab561 Find Boost.Filesystem directly in the OSS CMake build
Summary:
EdenFS uses `boost::filesystem` directly in `EdenConfig`, `EdenMount`, `Overlay`, `FsInodeCatalog`, `EphemeralFsInodeCatalog`, `OverlayChecker`, `EdenInit`, `PrjfsDispatcherImpl` and the privhelper test server, but its CMake build never looks Boost up. It links only because folly's exported CMake config brings `Boost::filesystem` along. Once `folly::fs` moves to `std::filesystem` and folly drops that dependency (D125722811), the OSS EdenFS build fails to link.

Find Boost.Filesystem in `EdenConfigChecks.cmake` and link `Boost::filesystem` into the libraries that compile those files: `eden_config`, `eden_inodes`, `eden_fscatalog`, `eden_overlay_checker`, `eden_service` and `eden_fuse_privhelper_test`. The lookup omits `MODULE`, which permits Boost package-config fallback, so it keeps working where CMake no longer ships FindBoost (CMP0167). Add `boost` to the eden getdeps manifest. This matches the edencommon fix (D126570941).

Reviewed By: genevievehelsel

Differential Revision: D126769174

fbshipit-source-id: edb53a072e6de5510d51943a05a08c1ef2c06cd8
2026-10-21 19:05:54 -07:00
Victor Zverovich
3f1970b092 Link Boost.Filesystem directly in the CMake build
Summary:
The getdeps builds of edencommon and watchman fail to link with the folly::fs switch (D125722811): `eden/common/utils` (`FileUtils.cpp`, `PathFuncs.cpp`) uses `boost::filesystem`, but the CMake build only got `Boost::filesystem` through folly's exported dependencies, and folly no longer asks Boost for `filesystem`. The link fails with undefined `boost::filesystem::detail::remove`/`rename`.

Find Boost's `filesystem` component in edencommon's own CMake, link `edencommon_utils` to `Boost::filesystem`, re-find it in the installed `edencommon-config.cmake` for dependents, and list `boost` as a direct getdeps dependency.

Reviewed By: genevievehelsel

Differential Revision: D126570941

fbshipit-source-id: 28f5e4e2017bed0019040d692560b5168099b939
2026-10-21 18:10:04 -07:00
Richard Barnes
05d1c685b8 Use co_withExecutor in proxygen/lib, pyrecs/fb and others +5
Summary:
`yourTask().scheduleOn(ex)` is deprecated in favor of `co_withExecutor(ex, yourTask())`

For `Task`, both forms are equivalent, but `co_withExecutor` makes it much easier to migrate to the [lifetime-safe `NowTask`](https://fb.prod.workplace.com/groups/192968587972839/posts/1784449738824708) (and upcoming `SafeTask`).

Thanks to [C++ ADL](https://en.cppreference.com/w/cpp/language/adl.html), you can write simply `co_withExecutor`; it does not *have* to be qualified with the namespace `folly::coro::`.

[This post](https://fb.prod.workplace.com/groups/192968587972839/posts/1693720697897613) explains the safety benefits of `co_withExecutor`. Moreover, the new name better aligns with the other `folly::coro` protocol of `co_withCancellation()`.

This diff generated with `fbcode/scripts/rbarnes/lsc/schedule_on_fixer.py` (extended to ignore comments and string literals), then `clang-format` on the changed lines. Macros and doc-comment examples were updated by hand.

 - If you approve of this diff, please use the "Accept & Ship" button :-)

___

landed-with-radar-review

Differential Revision: D126734298

fbshipit-source-id: 86f4d25135caa475fb4a47b093bbb98b8762eb60
2026-10-21 15:43:48 -07:00
Xiangyu Bu
3d4739b40c Forward setParserPaused to the codec wrapped by a chain-end filter
Summary:
Fix-forward for D123003021, root cause of S720522.

D123003021 sends HTTPCodecFilterChain::setParserPaused straight to the chain end and makes HTTPCodecFilter::setParserPaused an empty final. That assumes the chain end is a concrete codec. It is not always: x2pagentd's forward-proxy port installs ConnectPassthroughCodec (a PassThroughHTTPCodecFilter that owns an inner HTTP1xCodec in call_) as the session codec through a codec factory, so the filter is the chain end. Since D123003021, every pause/resume from HTTPSession lands on the empty final and never reaches the inner HTTP1xCodec. A WebSocket upgrade through localhost:10054 then gets its 101, and the connection is torn down on the first client frame: the S720522 symptom on ~5k corp hosts.

Make the final HTTPCodecFilter::setParserPaused forward to call_. The chain still calls the chain end directly, so filters in the middle of a chain are still skipped and the perf win of D123003021 stays; only a filter that is itself the chain end (or is called directly) forwards to the codec it wraps, as before D123003021.

Reviewed By: hnovikov

Differential Revision: D126459187

fbshipit-source-id: bef11d663d436c4d56484e55b4e5df54cae09e84
2026-10-21 15:41:30 -07:00
Open Source Bot
146c196a8b Updating hashes
Summary:
GitHub commits:

28db52b968
3fbfbbd6f7
adbd1a5468
e852691418
1947ae0ade
e760a68ab7
c88dd0b2e6
724b010a3f
70d31cf0b3
09b46f8f0f
bcdfb3e213
d0aca95efe
6a7d8ba7f7

Reviewed By: sdwilsh

fbshipit-source-id: 444f53e76149dfd31ed1d6e70e3e0ed206ce7a30
2026-10-21 09:33:13 -07:00
Oded Argon
724b010a3f Preserve bodies on non-upgrade WebSocket CONNECT responses
Summary:
`HTTP1xCodec` serializes WebSocket upgrades as `GET`, including requests represented as HTTP/2 `CONNECT`. Treating those requests as ordinary CONNECT tunnels discards bodies on responses that do not switch protocols. A non-upgrade response with `Content-Length` then fails coroutine body-length validation, turning the expected HTTP response into a 502. This includes an ordinary `200 OK` fallback as well as a rejected handshake.

Exclude WebSocket upgrades from ordinary CONNECT handling so non-upgrade response bodies are parsed normally. Keep Content-Length validation and successful upgrade handling intact. Add codec and coroutine-session tests for `401` and ordinary `200 OK` body preservation, plus a successful translated-upgrade test. Declare the direct `//folly:conv` build dependencies required by autodeps and regenerate the codec CMake dependency list. The repository mirrors these changes into `xplat/proxygen`.

This was found while investigating the Model API canary failure recorded in D124573071. A production origin logged `Content-Length/body mismatch: expected=104, actual=0` at the original failed-test time. This fix is independent of the Hatch retry change.

Use portable `folly::to<std::string>` conversions in the regression tests and a checked `folly::to<uint32_t>` conversion for the fixture body length.

Reviewed By: hanidamlaj

Differential Revision: D125794637

fbshipit-source-id: 5a37a7473d03196f2a071724d628372ec9c2aa04
2026-10-21 04:50:41 -07:00
Neil Spring
2f5ead1655 Add absl getdeps manifest
Summary: New `absl` manifest fetching pinned abseil-cpp via `[git]` (dodging `[download]`'s tarball sha256), or using distro packages where new enough for `absl::log`.

Reviewed By: KevinYakar

Differential Revision: D125537549

fbshipit-source-id: 58e881f68fcc55653ca83ef3e8acad6b54eec653
2026-10-20 16:05:10 -07:00
Open Source Bot
29fddb5671 Updating hashes
Summary:
GitHub commits:

8d1390ed79
2a12378eb2
8bb258942f
726fa2d62d
4f25ddd325
a94df18620
ec12ab6cc8
aff37b9380
b14cef8c92
370841e714
7de1925334
55e024b0a5
1ddba7f924
7856c9b276

Reviewed By: sdwilsh

fbshipit-source-id: c6cbd3eb30a78f89a3704d4ab553bc4d7cb583bb
2026-10-20 09:31:56 -07:00
Chris Hawley
fd450adbc2 Replace FOR_EACH_RANGE with a plain for loop in RendezvousHashTest.cpp
Summary:
Replaces the `FOR_EACH_RANGE` loop in `RendezvousHashTest.cpp` with a plain `for` loop. The loop var is spelled `std::size_t`, the type the macro's ternary deduced. Drops the now-unused `folly/container/Foreach.h` include and the `//folly/container:foreach` dep.

___

landed-with-radar-review

Differential Revision: D126407577

fbshipit-source-id: f094f6fc49a320e3ecbb60f06db1aca4012599c7
2026-10-20 08:15:29 -07:00
Stuart Clark
aff37b9380 Add askBarney, a netcat-style trace injector that punts its SYN to Fife
Summary:
# Context
Fife authorizes connections for vDPUs, and callers punt the opening TCP SYN with `authorize` so Fife can forward it (D125621587). We need a simple client to inject that traffic by hand, and the vDPU-side client has to be open source, so this tool is too.

# Product decisions
1. `askBarney --fife_ip X --fife_port Y --cert_path C [--key_path K] --ca_path A <host> <port>` works like netcat over TCP, except it first punts the connection's SYN to Fife.
2. The punt is `authorize(local_ip, dst_ip, syn)` over mTLS. askBarney prints Fife's `decision` and `forward` to stderr. Anything other than `ALLOWED` exits 1. If allowed, it relays stdin and stdout over the connection until the server closes it.

# Code decisions
- **The kernel owns the connection.** If askBarney made up its own SYN and only Fife sent it, the server's SYN-ACK would reach a kernel with no matching socket and be reset. So askBarney starts a normal non-blocking `connect()`, captures the SYN the kernel sends with an `AF_PACKET` socket, and punts those exact bytes. Because the punted SYN has the kernel's ports and sequence number, the server's SYN-ACK completes the kernel's connection whichever copy of the SYN reached the server. The kernel's own SYN also goes out directly.
- Capturing needs `CAP_NET_RAW`, so run it as root.
- **Open source only.** It uses folly, fbthrift, fmt, gflags and `folly::Init`, has Apache-2.0 headers, and doesn't depend on Fife's internal server code. That's why the SYN matcher (`TcpSyn`) is its own small parser rather than reusing `fife/server/IpPacket`. There are no Meta-specific default paths; the certificate, key and CA are required flags. Its only internal dependency is the generated client for `fife/if/fife.thrift`, which has to be published alongside it before it can ship.

# Test listener
`fife/askbarney/listen.py` (also `buck2 run fbcode//fife/askbarney:listen`) is a standard-library-only destination for askBarney tests. It listens on `--port` (default 17172, IPv6 and IPv4), replies to each connection with `--reply`, prints everything the peer sends, and keeps serving until Ctrl-C, or one connection with `--once`. It ships with askBarney in the open-source repo.

# Open-source build
- BUCK stays for the fbcode build. The open-source build is CMake plus getdeps, the standard pattern for Meta's open-source C++. All the dependencies (folly, fbthrift, fizz, wangle, fb303) are built and consumed that way, and a Makefile would mean hand-maintaining their include and link flags plus a Thrift code-generation rule.
- `fife/askbarney/public_tld/CMakeLists.txt` becomes the open-source repo's top level. It finds the dependencies and generates the `Fife` client from `fife/if/fife.thrift` with `add_fbthrift_cpp_library`, depending on `fb303::fb303_thrift_cpp` for the `fb303_core.thrift` include. `fife/askbarney/CMakeLists.txt` builds `askBarney`, `askbarney_tcp_syn` and the test.
- `opensource/fbcode_builder/manifests/askbarney` is the getdeps manifest. It maps `public_tld` to the repo root, ships `fife/askbarney/` and only `fife.thrift` from `fife/if`, and strips BUCK files. The open-source repo mirrors the fbcode layout so generated `#include` paths (`fife/if/gen-cpp2/...`) are the same in both builds.
- Before publishing: there's no GitHub repo yet, so the manifest has no `[git]` section and only works inside fbsource. `fife.thrift` still has the internal "Confidential and proprietary" header and needs an open-source license header through the open-source review.

Reviewed By: IvanTopolcic

Differential Revision: D125707320

fbshipit-source-id: 74c83cf24f46c5b9028d662847f473afa2b3b053
2026-10-19 22:20:33 -07:00
Neil Spring
0aa7ff7360 getdeps: Update libnl source pin to 3.11.0
Summary: Update the shared getdeps `libnl` source archive from 3.2.25 (July 16, 2014) to 3.11.0, including the verified SHA256 and extraction directory.

Reviewed By: gnikol

Differential Revision: D125878884

fbshipit-source-id: 765631166046d75c0f4552fe8b4b42e47c838da5
2026-10-19 15:40:02 -07:00
Matt Joras
eaaf3466c1 Recognize WebSockets over HTTP/3
Summary:
`HQStreamCodec` does not recognize an Extended CONNECT with `:protocol=websocket` as a WebSocket upgrade, so revproxy rejects it with `400 connect_method_disabled`. Mark downstream WebSocket CONNECTs as upgrades, matching `HTTP2Codec`, without a codec-specific enable flag. Both `HQSession` and `HQMultiCodec` use this behavior; D125389660 handles revproxy's per-VIP acceptance policy and `SETTINGS_ENABLE_CONNECT_PROTOCOL` advertisement.

Skip unknown frames, including GREASE and padding, on ordinary and WebSocket CONNECT streams. RFC 9114 section 4.4 requires rejecting known non-DATA frames; sections 7.2.8 and 9 require ignoring GREASE and unknown frame types. Known non-DATA frames still fail with `H3_FRAME_UNEXPECTED`.

Tests also pin the existing `QPACKCodec` conversion of an upgrade response from 101 to HTTP/3 status 200. The changed `xplat/proxygen/lib` mirrors are byte-identical.

Reviewed By: hanidamlaj

Differential Revision: D125389659

fbshipit-source-id: 808a4cea2036e5f235f318086215e44cf041b481
2026-10-19 12:20:19 -07:00
generatedunixname1575083460206073
4761a6dd5a Fix CQS signal clang-diagnostic-unused-parameter in xplat/proxygen/lib/http/webtransport:
Differential Revision: D125177608

fbshipit-source-id: 68a2c6afb9e73d9aaef377c67210b23af8443036
2026-10-19 12:07:37 -07:00
Open Source Bot
302eb35694 Updating hashes
Summary:
GitHub commits:

504b52fde4
77147d05bf
d6952cf33b
ed498f3ec3
557aa769d2
90b1a74746
ae8ead13b5
60fd82a537
0882b39343
14456cb4ee
4db30e1b74
604c66767e
16ceec15fc
4a4e7810fa

Reviewed By: sdwilsh

fbshipit-source-id: 429017d429a97ecd5ead6ddc5df540285398f5d2
2026-10-19 09:34:08 -07:00
Hani Damlaj
60fd82a537 remove HQIngressPushStream and ingressPushStreams_
Summary: removes `HQUpstreamSession::HQIngressPushStream`, `ingressPushStreams_`, and their dependent methods, continued efforts to remove all things http push related in proxygen/lib

Reviewed By: Carl-Elkhoury, jbeshay

Differential Revision: D124408744

fbshipit-source-id: 7ce23cf2c2879bb68553a78f41e8a7433b6d44be
v2026.10.19.00
2026-10-18 10:36:38 -07:00
Hani Damlaj
790dd05a05 remove HQUpstreamSession ingress push lookups
Summary: removes `HQUpstreamSession::findIngressPushStream` and `findIngressPushStreamByPushId`, continued efforts to remove all things http push related in proxygen/lib

Reviewed By: Carl-Elkhoury, jbeshay

Differential Revision: D124407785

fbshipit-source-id: 31f78a971edb8784ff27f1e1bf738c900af33a30
2026-10-18 10:36:38 -07:00
Hani Damlaj
ded8b91f5d remove class HQEgressPushStream & co
Summary: removes HQDownstreamSession::HQEgressPushStream, continued efforts to remove all things http push related in proxygen/lib

Reviewed By: Carl-Elkhoury, jbeshay

Differential Revision: D124403386

fbshipit-source-id: e7f0a14d21df63022b1abe708c5c072f283851b9
2026-10-18 10:36:38 -07:00
Hani Damlaj
afe4041c30 remove HQDownstreamSession::createEgressPushStream
Summary: removes `HQDownstreamSession::createEgressPushStream`, continued efforts to remove all things http push related in proxygen/lib

Reviewed By: jbeshay, Carl-Elkhoury

Differential Revision: D124399212

fbshipit-source-id: bf3b8d4efd3cd91b28328884e029f369086587cd
2026-10-18 10:36:38 -07:00
Hani Damlaj
883d02e214 remove HQDownstreamSession::findEgressPushStream
Summary: removes `HQDownstreamSession::findEgressPushStream`, continued efforts to remove all things http push related in proxygen/lib

Reviewed By: jbeshay, Carl-Elkhoury

Differential Revision: D124397335

fbshipit-source-id: e45fcaf2706b27e3bcd9cc52472d95054fb9346f
2026-10-18 10:36:38 -07:00
Hani Damlaj
367895d945 remove HQSession::eraseUnboundStream
Summary: removes `HQSession::eraseUnboundStream`, its override, and its caller, continued efforts to remove all things http push related in proxygen/lib

Reviewed By: Carl-Elkhoury, jbeshay

Differential Revision: D124395680

fbshipit-source-id: 0a8646983fea2d853b8d4cf59578320d8fdbe116
2026-10-18 10:36:38 -07:00
Hani Damlaj
45e4365dcd remove HQSession::cleanupUnboundPushStreams
Summary: removes `HQSession::cleanupUnboundPushStreams`, its override, and its caller, continued efforts to remove all things http push related in proxygen/lib

Reviewed By: Carl-Elkhoury, jbeshay

Differential Revision: D124393466

fbshipit-source-id: 48dad4045d102ff1ce7164e92845cab5d3c13bda
2026-10-18 10:36:38 -07:00
Hani Damlaj
6144c741c0 remove HQSession::erasePushStream
Summary: removes `HQSession::erasePushStream`, its overrides, and its caller, continued efforts to remove all things http push related in proxygen/lib

Reviewed By: Carl-Elkhoury, jbeshay

Differential Revision: D124391063

fbshipit-source-id: cbae5890658529765b8d87dd84555c26d82f2c18
2026-10-18 10:36:38 -07:00
Hani Damlaj
80793b9e67 remove ingressPushId_ from HQSession
Summary: removes `ingressPushId_`, its reads and writes, and the unused `onPushPromiseHeadersComplete` callback, continued efforts to remove all things http push related in proxygen/lib

Reviewed By: Carl-Elkhoury, jbeshay

Differential Revision: D124391059

fbshipit-source-id: 7c46f57264ee930f4ce6b9354930dc156ebae3e5
2026-10-18 10:36:38 -07:00
Hani Damlaj
205f1bf7fd remove ServerPushLifecycleCallback
Summary: removes `ServerPushLifecycleCallback`, its mock, and `ServerPushLifecycle.h`, continued efforts to remove all things http push related in proxygen/lib

Reviewed By: jbeshay, Carl-Elkhoury

Differential Revision: D124385264

fbshipit-source-id: f529f4f8a5e16a8b2af6e0adf4725ff1008f4955
2026-10-18 10:36:38 -07:00
Hani Damlaj
7094da18fb remove HQUpstreamSession::tryBindIngressStreamToTxn
Summary: removes `HQUpstreamSession` logic to bind ingress push streams to transactions, continued efforts to remove all things http push related in proxygen/lib

Reviewed By: jbeshay, Carl-Elkhoury

Differential Revision: D124382298

fbshipit-source-id: f57b916ab691afc0bda49ebd1180bdcafed7ddd4
2026-10-18 10:36:38 -07:00
Hani Damlaj
9c563c478b remove HQSession::createIngressPushStream
Summary: removes `HQSession` logic to create ingress push streams, continued efforts to remove all things http push related in proxygen/lib

Reviewed By: jbeshay, Carl-Elkhoury

Differential Revision: D124381941

fbshipit-source-id: c11643d0679470724f9e44a4d1a2694150a902d3
2026-10-18 10:36:38 -07:00
Hani Damlaj
19a9462839 remove findPushStream and findPushStreams
Summary: removes `HQSession` logic to find and enumerate push streams, continued efforts to remove all things http push related in proxygen/lib

Reviewed By: Carl-Elkhoury, jbeshay

Differential Revision: D124186601

fbshipit-source-id: ebd35ad654d2b29dd44870dbb37aac79d9bfed6b
2026-10-18 10:36:38 -07:00