curl/docs
Aritra Basu e78b1b3ecc
HTTP/3: add proxy CONNECT and MASQUE CONNECT-UDP support (ngtcp2 QUIC)
This patch adds two major proxy capabilities to curl (ngtcp2 QUIC):
- HTTP/3 Proxy CONNECT: Tunnel HTTP/1.1 or HTTP/2 traffic through an
  HTTPS proxy that speaks HTTP/3 (QUIC) using the standard CONNECT
  method over an HTTP/3 connection.
- MASQUE CONNECT-UDP: Tunnel HTTP/3 (QUIC) traffic through an HTTP
  proxy (speaking HTTP/1.1, HTTP/2, or HTTP/3) using the extended
  CONNECT method with the CONNECT-UDP protocol (RFC9297 & RFC9298).

Public API additions:
- `CURLPROXY_HTTPS3`: new proxy type constant for HTTP/3 proxy
- `--proxy-http3`: new CLI flag to negotiate HTTP/3 with HTTPS proxy

The implementation adds two new filters:
- `H3-PROXY` - enables negotiating HTTP/3 (QUIC) to the proxy and
  running CONNECT/CONNECT-UDP through that proxy transport.
- `CAPSULE` - dedicated filter inserted between QUIC transport and
  HTTP-PROXY to handle datagram capsule encapsulation/decapsulation.

Here is how the curl filter chaining looks in different scenarios:
- HTTP/3 Proxy CONNECT (tunneling TCP protocols over QUIC proxy):
  conn -> HTTP/1.1 or HTTP/2  -> SSL -> HTTP-PROXY ->
                                 H3-PROXY -> HAPPY-EYEBALLS -> UDP
- MASQUE CONNECT-UDP (tunneling QUIC over any proxy):
  conn -> HTTP/3 -> CAPSULE -> HTTP-PROXY -> H3-PROXY ->
                               HAPPY-EYEBALLS -> UDP
  conn -> HTTP/3 -> CAPSULE -> HTTP-PROXY -> H1-PROXY or H2-PROXY ->
                               SSL -> HAPPY-EYEBALLS -> TCP

- Both features currently require the ngtcp2 QUIC backend.
- Both features are experimental (disabled by default). Enable with
  `--enable-proxy-http3`(autotools) or `-DUSE_PROXY_HTTP3=ON`(CMake).

Tests:
- tests/unit/unit3400.c: Unit tests for capsule protocol encode/decode
- tests/http/test_60_h3_proxy.py: Comprehensive pytest integration suite
- tests/http/testenv/h2o.py: Managing h2o instances with HTTP/1.1, HTTP/2,
  and HTTP/3 (QUIC) listeners, proxy.connect and proxy.connect-udp enabled.

References:
  RFC 9297 - HTTP Datagrams and the Capsule Protocol
  RFC 9298 - Proxying UDP in HTTP
  RFC 9000 §16 — Variable-Length Integer Encoding

Signed-off-by: Aritra Basu <aritrbas+gh@cisco.com>

Closes #21153
2026-05-27 08:49:53 +02:00
..
cmdline-opts HTTP/3: add proxy CONNECT and MASQUE CONNECT-UDP support (ngtcp2 QUIC) 2026-05-27 08:49:53 +02:00
examples tidy-up: miscellaneous 2026-05-20 00:50:43 +02:00
internals HTTP/3: add proxy CONNECT and MASQUE CONNECT-UDP support (ngtcp2 QUIC) 2026-05-27 08:49:53 +02:00
libcurl HTTP/3: add proxy CONNECT and MASQUE CONNECT-UDP support (ngtcp2 QUIC) 2026-05-27 08:49:53 +02:00
tests HTTP/3: add proxy CONNECT and MASQUE CONNECT-UDP support (ngtcp2 QUIC) 2026-05-27 08:49:53 +02:00
.gitignore docs: add RELEASE-TOOLS.md.dist to .gitignore 2024-07-01 22:49:55 +02:00
ALTSVC.md docs: fold long lines 2025-12-11 11:42:28 +01:00
BINDINGS.md docs: some nitpicks 2026-02-27 23:05:37 +01:00
BUG-BOUNTY.md BUG-BOUNTY.md: minor rephrase to say there is no bug bounty 2026-03-10 17:34:08 +01:00
BUGS.md docs: avoid using the word 'magic' 2026-03-03 15:32:13 +01:00
CIPHERS-TLS12.md docs: update CIPHERS.md 2024-08-12 23:35:56 +02:00
CIPHERS.md CIPHERS.md: fix the example that uses only TLS 1.3 2026-05-22 11:18:02 -04:00
CMakeLists.txt build: stop building and installing runtests.1 and testcurl.1 2026-04-28 09:07:27 +02:00
CODE_OF_CONDUCT.md tidy-up: Markdown, clang-format nits 2026-01-22 23:44:47 +01:00
CODE_REVIEW.md docs: fix broken link in CODE_REVIEW.md 2025-06-21 10:32:06 +02:00
CONTRIBUTE.md docs: fix odd wording in CONTRIBUTE.md 2026-05-26 11:27:46 +02:00
curl-config.md docs: minor edits to please the new spellchecker regime 2025-02-27 13:15:21 +01:00
CURL-DISABLE.md lib: make SMB support opt-in 2026-03-22 11:55:39 +01:00
CURLDOWN.md tidy-up: sort TLS backends, distros, alphabetically 2026-05-11 11:57:25 +02:00
DEPRECATE.md DEPRECATE.md: fix copy-and-paste mistaken subtitles 2026-03-26 11:06:25 +01:00
DISTROS.md docs: add LibreELEC to DISTROS.md 2026-01-26 12:12:05 -08:00
EARLY-RELEASE.md stop using the word 'just' 2026-03-03 15:30:22 +01:00
ECH.md tidy-up: sort TLS backends, distros, alphabetically 2026-05-11 11:57:25 +02:00
EXPERIMENTAL.md HTTP/3: add proxy CONNECT and MASQUE CONNECT-UDP support (ngtcp2 QUIC) 2026-05-27 08:49:53 +02:00
FAQ.md docs: tidy-up scheme references 2026-05-19 16:55:45 +02:00
FEATURES.md tidy-up: miscellaneous 2026-01-20 12:37:56 +01:00
GOVERNANCE.md docs: avoid starting sentences with However, 2026-03-07 23:49:11 +01:00
HELP-US.md tidy-up: miscellaneous 2026-01-15 13:06:13 +01:00
HISTORY.md tidy-up: miscellaneous 2026-05-20 00:50:43 +02:00
HSTS.md hsts: accept 10K entries in the list 2026-04-02 10:22:35 +02:00
HTTP-COOKIES.md stop using the word 'just' 2026-03-03 15:30:22 +01:00
HTTP3.md tidy-up: git options, ECH, HTTP/3 documentation 2026-04-25 13:59:20 +02:00
HTTPSRR.md docs: tidy-up scheme references 2026-05-19 16:55:45 +02:00
INFRASTRUCTURE.md docs: tidy-up scheme references 2026-05-19 16:55:45 +02:00
INSTALL INSTALL: converted to markdown => INSTALL.md 2016-10-21 15:57:29 +02:00
INSTALL-CMAKE.md HTTP/3: add proxy CONNECT and MASQUE CONNECT-UDP support (ngtcp2 QUIC) 2026-05-27 08:49:53 +02:00
INSTALL.md tidy-up: sort TLS backends, distros, alphabetically 2026-05-11 11:57:25 +02:00
INTERNALS.md gsasl: fix potential double free 2026-05-15 11:49:06 +02:00
IPFS.md stop using the word 'just' 2026-03-03 15:30:22 +01:00
KNOWN_BUGS.md KNOWN_BUGS: remove stale Threads::Threads entry 2026-05-24 11:12:30 +02:00
KNOWN_RISKS.md progress: count amount of data "delivered" to application 2026-03-21 23:21:55 +01:00
MAIL-ETIQUETTE.md badwords: avoid 'simply' 2026-03-10 19:34:06 +01:00
Makefile.am creds: hold credentials 2026-05-12 16:05:15 +02:00
MANUAL.md docs: tidy-up scheme references 2026-05-19 16:55:45 +02:00
mk-ca-bundle.md stop using the word 'just' 2026-03-03 15:30:22 +01:00
options-in-versions HTTP/3: add proxy CONNECT and MASQUE CONNECT-UDP support (ngtcp2 QUIC) 2026-05-27 08:49:53 +02:00
README.md reuse: add copyright + license info to individual docs/*.md files 2024-03-31 12:01:18 +02:00
RELEASE-PROCEDURE.md RELEASE-PROCEDURE.md: update future release dates 2026-01-26 12:28:25 +01:00
ROADMAP.md CI: add whitespace checker 2024-06-27 13:33:30 +02:00
runtests.md badwords: avoid 'simply' 2026-03-10 19:34:06 +01:00
RUSTLS.md tidy-up: git options, ECH, HTTP/3 documentation 2026-04-25 13:59:20 +02:00
SECURITY-ADVISORY.md stop using the word 'just' 2026-03-03 15:30:22 +01:00
SPONSORS.md BUG-BOUNTY.md: we stop the bug-bounty end of Jan 2026 2026-01-26 08:26:28 +01:00
SSL-PROBLEMS.md tidy-up: Markdown, clang-format nits 2026-01-22 23:44:47 +01:00
SSLCERTS.md SSLCERTS: document 8.19.0 default Native CA builds (Windows) 2026-05-16 11:55:59 +02:00
testcurl.md tidy-up: Markdown, clang-format nits 2026-01-22 23:44:47 +01:00
THANKS scripts: catch Credits-to contributors 2026-05-17 22:48:22 +02:00
THANKS-filter tidy-up: miscellaneous 2026-05-16 01:56:17 +02:00
TheArtOfHttpScripting.md badwords: avoid 'simply' 2026-03-10 19:34:06 +01:00
TODO.md docs: tidy-up scheme references 2026-05-19 16:55:45 +02:00
URL-SYNTAX.md docs: tidy-up scheme references 2026-05-19 16:55:45 +02:00
VERIFY.md tidy-up: whitespace 2026-04-27 13:34:27 +02:00
VERSIONS.md tidy-up: miscellaneous 2026-04-30 20:22:23 +02:00
VULN-DISCLOSURE-POLICY.md VULN-DISCLOSURE-POLICY.md: emphasize the no email thank you part 2026-05-26 10:00:22 +02:00
wcurl.md spacecheck: check long lines and repeat spaces, fix fallouts 2026-03-25 11:02:08 +01:00

curl logo

Documentation

You find a mix of various documentation in this directory and subdirectories, using several different formats. Some of them are not ideal for reading directly in your browser.

If you would rather see the rendered version of the documentation, check out the curl website's documentation section for general curl stuff or the libcurl section for libcurl related documentation.