Repository navigation
CWIST v3.2
CWIST v3.2 — HTTP/3 standards compliance, security, and scalability hardening
Highlights since v3.1:
HTTP/3 correctness and strict-client (Firefox/neqo) interop
- Request pseudo-header validation per RFC 9114 Section 4.3.1
(missing/duplicate/out-of-order :method/:scheme/:path/:authority,
CONNECT rules) with 400 rejection instead of silent dispatch. - Invalid or 1xx final statuses coerced to 500; handler-supplied HEAD
content-length is validated; SETTINGS_H3_DATAGRAM is now paired with
the QUIC DATAGRAM transport parameter; WebTransport settings are
actually advertised; GOAWAY + CONNECTION_CLOSE on shutdown via
engine cooldown instead of silently dropping connections. - Repaired the HTTP/3 client stack: fixed a connect-time segfault
(NULL local address), a write-arming race, missing request FIN,
response header decoding, and a timeout-path use-after-free. - HTTP/3 client now verifies server certificates by default; explicit
cwist_http3_client_set_insecure() opt-out replaces the implicit
no-verify behavior.
Security and memory safety
- Closed an ASan-verified use-after-free in response destruction on
the shared request/response arena path. - gzip/deflate/brotli/zstd compression can no longer emit truncated
bodies under output-buffer pressure.
Performance and scalability (re-measured)
- Arena bump allocator + shared per-request arena + recycled arena
structs; worker stacks actually capped at 256 KiB. - C1M reactor holds 1,000,000 connections at ~244 MB RSS
(~14-16 s wall per 125K client process); classic pool C100K at
~9.2 GB RSS. Keep-alive throughput ~129-136k req/s on the bench
machine. - One io_uring_enter + one recv per keep-alive request; C1M reactor
RSS cut ~19% via on-demand ring paging.
Reliability fixes
- TLS handshake shepherd is now sharded (up to 8 threads/process) and
its deadline bounds stalls instead of queueing delay, fixing ~15-25%
handshake loss under C100K HTTPS connect bursts. - HTTP/2 sequenced-DATA waits for WINDOW_UPDATE instead of dropping
the connection after HEADERS; 0-RTT 425 and error responses carry
bodies — no more silent 0-byte replies on non-idempotent routes. - io_uring reactor no longer hangs on SIGTERM when idle (bounded
100 ms wait, matching the epoll path).