Changes for version 0.45 - 2026-09-09

  • ADDS: HTTP/3 over QUIC (ngtcp2 + nghttp3). `http3 => 1` beside a certificate serves h3 on the same port over UDP, through the same sync, Future and psgi.streaming paths as HTTP/1.1 and HTTP/2.
  • ADDS: ABI v8 stream_on_data. A stream handle becomes bidirectional: request bytes go to a callback instead of being buffered into psgi.input, which a tunnelled stream needs because it never ends.
  • ADDS: Extended CONNECT (RFC 8441 on HTTP/2, RFC 9220 on HTTP/3), the WebSocket handshake for a multiplexed transport.
  • ADDS: datagrams_out in Hyperman->stats, and bytes_out on HTTP/3 is no longer counted twice.
  • ADDS: http3_max_conns, and h3_conns / h3_live / h3_requests / datagrams in Hyperman->stats.
  • FIX: client certificates were not reported over HTTP/3. SSL_CLIENT_VERIFY read NONE for a peer that had presented a valid one, so an application checking it refused a client it should have accepted. mTLS now reports identically on every transport.
  • FIX: reloading certificates rebuilt the TCP context and left the QUIC one stale, so a fleet served a fresh certificate over TCP and an old one over QUIC. Both are now swapped together or neither is.
  • FIX: tools/cppcheck.sh reported clean whatever cppcheck found, and never defined HM_HAVE_HTTP3 - so no QUIC or HTTP/3 code had been analysed. Both fixed, and the findings that surfaced.
  • FIX: an application that answered through a stream handle and then returned a sentinel put TWO responses on one HTTP/2 or HTTP/3 stream. The sentinel is now discarded, as it already was on the detach path.
  • FIX: HTTP/3 throughput collapsed about 20x under sustained concurrent large responses. A stream blocked by flow control was handed to nghttp3 and never unblocked, because ngtcp2's extend_max_stream_data callback was not registered.
  • HTTP/3 address validation: Retry above a half-open threshold, NEW_TOKEN so a returning client skips it, and a Stateless Reset for a connection id this server does not hold.
  • FIX: the depend block missed xs/bus.xs and six headers that Hyperman.xs includes, so a rebuild could test stale objects.
  • FIX: t/41-stream-abi.t's backpressure test could not reach the high-water mark where a Linux send buffer autotunes past the body, and reported no pause. The client now caps its own receive window and the body outgrows the buffers.

Modules

an event-loop PSGI server
epoll readiness backend for Hyperman::Loop
io_uring backend for Hyperman::Loop
kqueue readiness backend for Hyperman::Loop
portable poll(2) backend for Hyperman::Loop
a fast, native, Future-compatible async result
the per-worker event loop
the object that writes a response body a piece at a time
Plack/PSGI adapter for the Hyperman server