Skip to content

feat: make HTTP/3 opt-in in the Rust crate - #595

Draft
metalwarrior665 wants to merge 1 commit into
masterfrom
feat/http3-opt-in
Draft

metalwarrior665 wants to merge 1 commit into
masterfrom
feat/http3-opt-in

Conversation

@metalwarrior665

@metalwarrior665 metalwarrior665 commented Oct 22, 2026 •

Copy link
Copy Markdown
Member

reqwest's http3 feature makes every client that uses use_preconfigured_tls build an HTTP/3 connector, even when HTTP/3 is never used. That means a quinn endpoint per client: a UDP socket, a driver task, and a zeroed receive buffer of at least 2 MB.

In a CPU profile of a Rust Instagram scraper that builds one impit client per proxy session, this endpoint setup took ~6% of all CPU, for a protocol it never uses.

HTTP/3 support is now behind a new http3 feature of the impit crate:

  • With the feature off, clients skip the QUIC setup, and hickory-* and tokio aren't needed.
  • The crate builds without --cfg reqwest_unstable.
  • impit-node and impit-python enable the feature, so their http3 option behaves as before.
  • For Rust users, with_http3() now needs features = ["http3"]. It's removed from the README and doc examples.

CI now also runs cargo test -p impit --features http3, and the docs are built with the feature on.

The proxy fix that used to be part of this PR is now #598. Whichever of the two lands second needs #[cfg(feature = "http3")] on #598's test, which calls with_http3().

🤖 Generated with Claude Code

https://claude.ai/code/session_0148RYR4BTGyCYHENSRZjC3S

reqwest's `http3` feature makes every client set up a QUIC endpoint (a UDP
socket, a driver task and a receive buffer of at least 2 MB), even when HTTP/3
is never used. HTTP/3 support is now behind the `http3` feature of the `impit`
crate, so clients without it skip that setup, and the crate builds without
`--cfg reqwest_unstable`. The Node and Python bindings enable the feature, so
their `http3` option works as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0148RYR4BTGyCYHENSRZjC3S
@metalwarrior665 metalwarrior665 changed the title fix: never send HTTP/3 requests past the proxy, make HTTP/3 opt-in in the Rust crate feat: make HTTP/3 opt-in in the Rust crate Oct 23, 2026
@metalwarrior665
metalwarrior665 requested a balanced review from Copilot October 23, 2026 21:20

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Approval recommended

The feature gates, binding configuration, documentation, and CI changes are consistent, with no blocking issues identified.

No open issues 🎉

What changed in this PR

Makes HTTP/3 opt-in for the Rust crate, avoiding unnecessary QUIC setup for default clients while preserving HTTP/3 support in the Node.js and Python bindings.

Changes:

  • Adds an http3 Cargo feature and gates HTTP/3-specific code and dependencies.
  • Updates examples and documentation to reflect the new opt-in requirement.
  • Adds feature-enabled CI tests and includes HTTP/3 APIs in generated documentation.
File Description
README.md Documents HTTP/3 opt-in and simplifies the example.
impit/​src/​lib.rs Gates the HTTP/3 module and updates crate documentation.
impit/​src/​impit.rs Gates HTTP/3 functionality and tests default-disabled behavior.
impit/​README.md Updates feature requirements and the example.
impit/​examples/​basic.rs Removes HTTP/3 from the default example.
impit/​Cargo.toml Defines the feature and makes supporting dependencies optional.
impit-python/​Cargo.toml Enables HTTP/3 for Python bindings.
impit-node/​Cargo.toml Enables HTTP/3 for Node.js bindings.
.github/​workflows/​format.yaml Adds tests with HTTP/3 enabled.
.github/​workflows/​docs.yaml Builds documentation with HTTP/3 enabled.

Review effort: Balanced

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants