| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| 4.10.0 source code.tar.gz | 2026-11-09 | 459.6 kB | |
| 4.10.0 source code.zip | 2026-11-09 | 565.1 kB | |
| README.md | 2026-11-09 | 3.5 kB | |
| Totals: 3 Items | 1.0 MB | 0 | |
Security
- A server could make hackney buffer an unlimited amount of data despite
max_body_size, by sending an HTTP/1.1 chunked body made of one very large chunk: the limit was only checked once a whole chunk had arrived. Chunk data is now handed on as it arrives, so the limit holds and streamed reads no longer wait for the end of a chunk. A chunk-size line longer than 4096 bytes or a size of more than 16 hex digits is now refused.
Changed
- An HTTP/2 or HTTP/3 request made when the connection is at the server's
limit on concurrent streams now waits for a free stream instead of
failing at once. Many servers allow 100 or 128 at a time, so a
burst of requests used to fail where HTTP/1.1 would have queued them. A
request waits up to
checkout_timeout, then fails withcheckout_timeout. Based on work by Lennart Schoch (#972). - A request the server refused without processing it, because of a GOAWAY, an HTTP/2 refused stream or an HTTP/3 rejected request, is now sent once more on a fresh connection, whatever its method. It used to fail, and most callers did not know that error was safe to retry. A body given as a function is not sent twice. Based on work by Lennart Schoch (#971).
- quic 2.6.1, h2 0.15.0 and webtransport 0.5.3. These bring fixes for an HTTP/3 header block that could keep a CPU busy for minutes, and for two HTTP/2 denial-of-service attacks (MadeYouReset and SETTINGS flood), plus many protocol conformance and reliability fixes.
- WebTransport now speaks draft-17 over HTTP/3 and draft-16 over HTTP/2.
Servers on older drafts may no longer connect; a
draft07compat mode is available for draft-07 servers. WebTransport over HTTP/2 now needs TLS 1.3. - When an HTTP/3 server closes the connection with an error code, the error you get now carries that code and phrase instead of reporting a normal close.
Added
- WebTransport subprotocol negotiation with the
protocolsandrequire_protocoloptions ofwt_connect. The server's choice is inwt_session_info/1. - In active mode, WebTransport sends
{stream_credit, bidi | uni}once the server allows more streams afterwt_open_stream/2hit its limit.
Fixed
- An HTTP/3 request whose stream the server reset after sending headers waited until its timeout. It now fails at once with the reset reason.
- A request body given as a function crashed the connection on HTTP/2 and HTTP/3; it worked only on HTTP/1.1. It is now sent as the function yields it, on all three. If the function fails part way, you get its error and the half-sent request is cancelled (#1001).
wt_close/2with a reason longer than 1024 bytes returnedokbut never closed the session. It now returns an error and the session stays open. The same now applies to an error code over 32 bits or a reason that is not valid UTF-8, which the drafts forbid.- Reading a chunked HTTP/1.1 body no longer slows down with large chunks. The time grew with the square of the chunk size: a 16 MB body sent as one chunk took about 10 seconds on loopback, and now takes about 25 ms (#998, [#378]).
- Pooled requests to
http+unixURLs now work. They always failed withnxdomain, so only unpooled requests could reach a unix socket. Socket paths with capital letters also work now (#997). hackney:cookies/1no longer crashes when a response has an emptySet-Cookieheader; that header is skipped and the other cookies are returned (#994).