Skip to content

CWIST v3.2

Choose a tag to compare

@gg582 gg582 released this 29 Aug 13:59
· 1431 commits to main since this release

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).