Repository navigation
🔁 Reset rejected HTTP/2 streams on the wire
zttp 0.0.35 sends RST_STREAM for every HTTP/2 stream it rejects, so clients get an answer instead of waiting forever. You will notice it with malformed requests, such as a plain CONNECT or a content-length that does not match the body.
pip install --upgrade zttp==0.0.35- Rejected streams no longer hang the client (#288). zttp used to surface a
RstStreamevent for streams it rejected, but never queued the frame fordata_to_send(). It now sends it whennext_event()returns the event. Resets sent by the peer are still not echoed back. - Streams reset on DATA errors are closed (#288). DATA after
END_STREAMand flow-control errors now close and evict the stream, so it stops counting towardMAX_CONCURRENT_STREAMSand accepts no more frames. These resets count towardmax_stream_resets.
🧰 Friendlier Python API
send_dataaccepts any contiguous buffer (#290).Connection.send_dataandStream.send_datatakememoryview,bytearrayand other buffers, not onlybytes. The data is copied, so the buffer is only borrowed for the call.- Name HTTP/2 error codes with
zttp.H2ErrorCode(#284). AnIntEnumof the RFC 9113 error codes forStream.reset(),H2Connection.close(),RstStream.error_codeandGoAway.error_code.
📡 Sturdier HTTP/3
- Out-of-range QUIC packet numbers are dropped (#291). A packet whose number decodes past
2^62 - 1(RFC 9000 12.3) is now dropped before decryption, instead of closing the HTTP/3 connection when zttp tried to ACK it.
⚠️ Python 3.11 or newer
- Python 3.10 is no longer supported (#283). zttp now requires Python 3.11+, and no wheels are built for 3.10.
Full changelog: v0.0.34...v0.0.35