Skip to content

Protocol support ​

Titanium speaks HTTP/1.0, HTTP/1.1, HTTP/2, and HTTP/3, and can bridge between them when client and origin disagree.

For implementers / .NET library users — the tables below use API names (EnableHttp2, EnableHttp3, TWP001). CLI and Inspector enable HTTP/3 when QUIC is available; see HTTP/3.

HTTP/2 is on by default. HTTP/3 is on by default in the CLI and Inspector when QUIC is available. The library property EnableHttp3 stays off until the host turns it on. CLI/Inspector release zips bundle MsQuic natives per platform; Library hosts install system MsQuic — see HTTP/3.

Protocol bridges ​

ClientOriginKind
HTTP/1.xHTTP/1.xNative
HTTP/2HTTP/2Native frame relay when the route table is forward-host equivalent (one shared origin connection per client connection). Per-stream dispatch via Http2OriginConnectionPool when RequiresPerRequestDispatch applies (explicit listeners, non-equivalent routes, or policies).
HTTP/3HTTP/3Native when EnableHttp3
HTTP/1.1 ↔ HTTP/2BridgeWhen UpstreamHttpProtocol + AllowHttpProtocolTranslation
HTTP/1.1 / HTTP/2 ↔ HTTP/3BridgeWhen H3 selected
HTTP/3 → HTTP/2 / HTTP/1.1BridgeVia origin connection helpers

Not supported: Upgrade: h2c (prior-knowledge only); mid-connection H2→H3 on an open H2↔H2 MITM session; explicit QUIC proxying (inbound H3 is transparent QUIC / dual-listen only).

WebSocket over HTTP/3 (RFC 9220): when EnableRfc8441 = true, the proxy advertises SETTINGS_ENABLE_CONNECT_PROTOCOL (0x08) on HTTP/3 and bridges extended CONNECT (:protocol = websocket) to HTTP/1.1, HTTP/2, and HTTP/3 WebSocket origins (HTTP/1.1 upgrade, or native extended CONNECT when the origin advertises the setting; otherwise HTTP/1.1 fallback).

Explicit HTTP proxy and origin Alt-Svc. A browser that uses the proxy as an explicit HTTP proxy sends traffic as TCP (CONNECT) and cannot send QUIC through it. The origin's Alt-Svc header is still forwarded. Checked locally with Chrome, Edge, and Firefox (QUIC left enabled, loopback not bypassed): later requests stayed on the proxy, and no UDP arrived at the advertised HTTP/3 port. Safari was not part of that run. The proxy's own HTTP/3 to the server is separate; it still learns Alt-Svc for its origin cache.

Connections and framing (high level) ​

FeatureH1.0H1.1H2H3
Keep-alive / multiplexingYesYesYesYes
Chunked / DATA framesN/A / YesYesDATADATA
TrailersN/AYesYesYes
WebSocketYesYesRFC 8441RFC 9220 (H1/H2/H3 origin)
connect-tcpNoNoOpt-in (enableConnectTcp / acceptConnectTcp)501

For the full matrix (headers, flow control, SETTINGS/PING/GOAWAY, streaming, auth), see the Protocol-Support wiki.

Response compression ​

Opt-in server.responseCompression compresses origin responses (brotli or gzip), either buffered (up to 1 MiB with a known length) or, with mode: streaming, while the body is relayed. Streaming has no size limit, flushes per upstream chunk and uses chunked framing (HTTP/1.1) or DATA frames (the HTTP/2 bridge); HTTP/1.0 clients get identity. See Configuration.

PathCompressed
HTTP/1.1 client, HTTP/1.1 origin (session path)Yes
HTTP/2 client, HTTP/1.1 origin (bridge)Yes
HTTP/2 client, HTTP/2 originNo
HTTP/3No
HTTP/1.1 client, HTTP/2 originNo

Opt-in server.requestDecompression decompresses gzip and brotli request bodies before they reach the origin, with a decompressed-size cap and a ratio limit; a breach answers 413, a corrupt body 400. It runs on the session path after the headers are decoded, including HTTP/2 and HTTP/3. Extended CONNECT and the compressed fast path are left unchanged. See Configuration.

gRPC-Web ​

A route with grpcWeb: true translates a binary gRPC-Web call (application/grpc-web or application/grpc-web+proto) to native gRPC for an HTTP/2 origin, and folds the origin trailers into a final 0x80 frame. It runs on the HTTP/2-to-HTTP/2 dispatch bridge and on the HTTP/1.1-to-HTTP/2 bridge. Unary and server-streaming only; application/grpc-web-text is not translated. See Configuration for the flag and CORS guidance.

Routing and clusters ​

Per-request route dispatch runs on the HTTP/1 session path, the HTTP/1-to-HTTP/2 bridge, the HTTP/2-to-HTTP/1 bridge, the HTTP/2-to-HTTP/2 dispatch bridge (SendHttp2ToHttp2DispatchBridge), the HTTP/2-to-HTTP/3 bridge, and HTTP/3 streams. A session-less HTTP/3 fast path stays on the listener forward target only when the route table is forward-host equivalent; any other route table takes the session path so the route is honored. HTTP/2-to-HTTP/2 native frame relay is unchanged when the listener is forward-host equivalent (no per-request dispatch).

Core, CLI, and website: MIT