h2
An HTTP/2 client and server
0.4.18
762M downloads/mo
#95 most downloaded on crates.io
hyperium/h2
What this package is like to depend on
Last release 3 days ago
20 Aug 2026
Ships fairly regularly
a new release about every 2 months
Nearly every release is documented
notes for 75 of 82 stable releases
1 version withdrawn
withdrawn after publishing
9 years old
86 releases · first in 2017
6 releases in the last 12 months
see the full history below
Release timeline
86 releases · Mar 2017 to Aug 2026Releases
latest 60 of 86-
0.4.1820 Aug 2026Release notes
Open source →What's Changed
- feat: allow configuring the DATA frame budget by @muhamadazmy in #942
- docs: tighten wording on data_frame_budget() by @seanmonstar in #943
New Contributors
- @muhamadazmy made their first contribution in #942
Full Changelog: v0.4.17...v0.4.18
-
0.4.1719 Aug 2026Release notes
Open source →What's Changed
- fix: dont budget DATA frames that are EOS by @seanmonstar in #940
- fix: cap max allowed encoder table size by @seanmonstar in #941
Full Changelog: v0.4.16...v0.4.17
Release notes
Open source →- Fix limiting of excessive small DATA frames to ignore EOS frames.
- Fix HPACK encoding table to cap the max size to 4kb.
-
0.4.1617 Aug 2026Release notes
Open source →What's Changed
- fix: error instead of busy-looping when write returns
Ok(0)by @ArniDagur in #921 - Revert "perf(header): optimize
HeaderValuecreation via zero-copy sharing" by @0x676e67 in #924 - fix: preserve received END_STREAM across HTTP/2 stream resets by @howardjohn in #922
- streams: reject connection-specific header fields in send_trailers (RFC 9113 §8.2.2) by @scadastrangelove in #925
- perf: optimize HPACK decoding with 8-bit tables by @seanmonstar in #926
- Avoid flushing h2 socket while holding stream locks by @brentechols in #918
- perf: reuse HPACK encode buffer across frames by @dorianverlaine in #929
- fix: CI failure on nightly due to deprecated
std::usizeandstd::u32use by @ArniDagur in #932 - fix: Missed wakeup in
poll_trailersby @ArniDagur in #931 - fix: Release flow control capacity when
RecvStreamis dropped by @ArniDagur in #930 - fix: limit excessive amount of small DATA frames by @seanmonstar in #935
- fix: prevent double counting pushed streams after 1xx responses by @seanmonstar in #936
New Contributors
- @scadastrangelove made their first contribution in #925
- @brentechols made their first contribution in #918
- @dorianverlaine made their first contribution in #929
Full Changelog: v0.4.15...v0.4.16
Release notes
Open source →- Fix limiting excessive amount of small DATA frames.
- Fix double counting pushed streams when receiving 1xx responses.
- Fix releasing of flow control capacity earlier, when
RecvStreamis dropped. - Fix missed wakeup in
poll_trailers. - Fix extra memory retained when copying
HeaderValues. - Fix resets received after END_OF_STREAM to allow the data to still be received.
- Fix busy-looping when IO write returns 0 to mean connection closed.
- Optimize HPACK decoding tables from 4-bit states to 1-byte states.
- Optimize IO writing contention by not holding lock while flushing.
- fix: error instead of busy-looping when write returns
-
0.4.1515 Jun 2026Release notes
Open source →What's Changed
- fix: Discard buffered DATA when a scheduled reset is pending by @ArniDagur in #896
- fix: poll_capacity must not return Ready(Some(Ok(0))) by @ArniDagur in #898
- fix: Reject frames on streams whose HEADERS haven't been sent by @ArniDagur in #899
- chore(ci): update actions/checkout to v6 by @seanmonstar in #910
- fix: Remove unnecessary clones by @FranciscoTGouveia in #911
- fix: use HeaderMap::try_append to prevent panics on absurd amounts of headers by @imlk0 in #909
- fix: ignore library resets at connection poll loop level by @seanmonstar in #913
- fix: remove padded_len() u8 overflow in DATA frame padding release by @seanmonstar in #914
- fix: close connection when header size is way too large by @seanmonstar in #915
- Prepare v0.4.15 by @seanmonstar in #916
New Contributors
- @FranciscoTGouveia made their first contribution in #911
- @imlk0 made their first contribution in #909
Full Changelog: v0.4.14...v0.4.15
Release notes
Open source →- Fix closing a connection when header size is "way too large" (currently x4 configured limit).
- Fix overflow calculating padding length if a DATA frame had 255 bytes of padding.
- Fix ignoring library-initiated resets in the connection state loop.
- Fix decoding panic with an absurd amount of headers and no limit to now use
try_append(). - Fix rejecting frames on streams whose HEADERS have not been sent.
- Fix
poll_capacity()to not returnSome(Ok(0)). - Fix discarding of buffered DATA frames when a reset is scheduled.
-
0.4.1404 May 2026Release notes
Open source →What's Changed
- fix(stream): avoid RST before initial HEADERS on idle streams by @DDtKey in #875
- fix: filter stream initiator in recv_go_away (#885) by @ofek-sha in #886
- perf(header): optimize
HeaderValuecreation via zero-copy sharing by @0x676e67 in #884 - Add
header_table_sizeto server builder by @ArniDagur in #888 - check final response in poll_informational by @zh-jq in #889
- fix: Avoid capacity leak or panic when a stream is cancelled after
reserve_capacityby @ArniDagur in #893 - fix: Flow control capacity leak with padded frames by @ArniDagur in #894
- fix: Account for connection flow control on DATA after GOAWAY by @ArniDagur in #895
- fix:
set_resetmust notify send task (missed wakeup) by @ArniDagur in #897 - Prepare v0.4.14 by @seanmonstar in #901
New Contributors
- @ofek-sha made their first contribution in #886
- @0x676e67 made their first contribution in #884
- @ArniDagur made their first contribution in #888
- @zh-jq made their first contribution in #889
Full Changelog: v0.4.13...v0.4.14
Release notes
Open source →- Add
header_table_size()option to server builder. - Fix leaking connection flow control of padded DATA frames when stream is reset.
- Fix leaking connection flow control when canceling a stream after reserving capacity.
- Fix leaking connection flow control when receiving a DATA frame after GOAWAY.
- Fix waking the
poll_capacitywhen locally reseting a stream from library. - Fix sending HEADERS on a reset stream before the RST_STREAM frame.
- Fix receiving GOAWAY to not close peer-initiated streams.
- Optimize header value decoding to copy less bytes.
-
0.4.1305 Jan 2026Release notes
Open source →What's Changed
- Implement HTTP/2 informational responses (1xx) support by @apu031 in #865
- fix: Unparent connection span by @Jesse-Bakker in #868
- fix: auto-release padding from DATA frames by @seanmonstar in #869
- fix: do not assign capacity for pending streams by @benjaminp in #860
- perf: reduce huffman decode table size by @ariaandika in #871
New Contributors
- @Jesse-Bakker made their first contribution in #868
- @ariaandika made their first contribution in #871
- @apu031 made their first contribution in #865
- @benjaminp made their first contribution in #860
Full Changelog: v0.4.12...v0.4.13
Release notes
Open source →- Add support for 1xx informational responses on client and server side.
- Fix auto-releasing of padding bytes of DATA frames for flow control windows.
- Fix to stop assigning capacity to pending streams which can't use it yet.
- Fix tracing to not grab the parent for the connection span.
-
0.4.1206 Aug 2025Release notes
Open source →What's Changed
- chore: update to webpki-roots 1 by @tottoto in #851
- docs: update readme about production readiness by @seanmonstar in #854
- refactor: reduce noise in fmt::Debug outputs by @seanmonstar in #855
- fix: adjust expiring reset stream limits by @seanmonstar in #858
Full Changelog: v0.4.11...v0.4.12
Release notes
Open source →- Fix default limits on max stored reset streams and duration to more reasonable values.
-
0.4.1130 Jun 2025Release notes
Open source →- Fix client to not return an error when a clean shutdown otherwise doesn't get a TLS close_notify, which some servers don't bother sending.
-
0.4.1005 May 2025Release notes
Open source →- Fix
is_end_stream()to return true only when ended cleanly, not when errored.
- Fix
-
0.4.914 Apr 2025Release notes
Open source →- Add
sever::Connection::has_streams()method to check for active streams.
- Add
-
0.4.818 Feb 2025Release notes
Open source →- Fix handling implicit stream resets at the more correct time.
- Fix window size decrements of send-closed streams.
- Fix reclaiming of reserved capacity when streams are closed.
- Fix to no longer call
poll_flushafterpoll_shutdown. - Fix busy loop in task when poll_shutdown returns pending.
-
0.4.719 Nov 2024Release notes
Open source →- Fix treating HEADERS frames with a non-zero content-length but END_STREAM flag as malformed.
- Fix notifying the stream task when automatically reset on receipt of a stream error.
-
0.4.619 Aug 2024Release notes
Open source →- Add
current_max_send_streams()andcurrent_max_recv_streams()toclient::SendRequest. - Fix sending a PROTOCOL_ERROR instead of REFUSED_STREAM when receiving oversized headers.
- Fix notifying a PushPromise task properly.
- Fix notifying a stream task when reset.
- Add
-
0.4.517 May 2024Release notes
Open source →- Fix race condition that sometimes hung connections during shutdown.
- Fix pseudo header construction for CONNECT and OPTIONS requests.
-
0.4.403 Apr 2024 -
0.4.315 Mar 2024Release notes
Open source →- Fix flow control limits to not apply until receiving SETTINGS ack.
- Fix not returning an error if IO ended without
close_notify. - Improve performance of decoding many headers.
-
0.4.217 Jan 2024Release notes
Open source →- Limit error resets for misbehaving connections.
- Fix selecting MAX_CONCURRENT_STREAMS value if no value is advertised initially.
-
0.4.108 Jan 2024Release notes
Open source →- Fix assigning connection capacity which could starve streams in some instances.
-
0.4.015 Nov 2023 -
0.3.2711 Jul 2025Nothing published for this version
-
0.3.2603 Apr 2024Nothing published for this version
-
0.3.2515 Mar 2024Nothing published for this version
-
0.3.2417 Jan 2024Nothing published for this version
-
0.3.2310 Jan 2024Nothing published for this version
-
0.3.2215 Nov 2023Release notes
Open source →- Add
header_table_size(usize)option to client and server builders. - Improve throughput when vectored IO is not available.
- Update indexmap to 2.
- Add
-
0.3.2121 Aug 2023Release notes
Open source →- Fix opening of new streams over peer's max concurrent limit.
- Fix
RecvStreamto return data even if it has received aCANCELstream error. - Update MSRV to 1.63.
-
0.3.2026 Jun 2023Release notes
Open source →- Fix panic if a server received a request with a
:statuspseudo header in the 1xx range. - Fix panic if a reset stream had pending push promises that were more than allowed.
- Fix potential flow control overflow by subtraction, instead returning a connection error.
- Fix panic if a server received a request with a
-
0.3.1912 May 2023Release notes
Open source →- Fix counting reset streams when triggered by a GOAWAY.
- Send
too_many_resetsin opaque debug data of GOAWAY when too many resets received.
-
0.3.1817 Apr 2023 -
0.3.1713 Apr 2023 withdrawnRelease notes
Open source →- Add
Error::is_library()method to check if the originated insideh2. - Add
max_pending_accept_reset_streams(usize)option to client and server builders. - Fix theoretical memory growth when receiving too many HEADERS and then RST_STREAM frames faster than an application can accept them off the queue. (CVE-2023-26964)
- Add
-
0.3.1627 Feb 2023Release notes
Open source →- Set
Protocolextension on requests when received Extended CONNECT requests. - Remove
B: Unpin + 'staticbound requiremented of bufs - Fix releasing of frames when stream is finished, reducing memory usage.
- Fix panic when trying to send data and connection window is available, but stream window is not.
- Fix spurious wakeups when stream capacity is not available.
- Set
-
0.3.1524 Oct 2022Release notes
Open source →- Remove
B: Bufbound onSendStream's parameter - add accessor for
StreamIdu32
- Remove
-
0.3.1416 Aug 2022Release notes
Open source →- Add
Error::is_resetfunction. - Bump MSRV to Rust 1.56.
- Return
RST_STREAM(NO_ERROR)when the server early responds.
- Add
-
0.3.1331 Mar 2022 -
0.3.1209 Mar 2022Release notes
Open source →- Avoid time operations that can panic (#599)
- Bump MSRV to Rust 1.49 (#606)
- Fix header decoding error when a header name is contained at a continuation header boundary (#589)
- Remove I/O type names from handshake
tracingspans (#608)
-
0.3.1126 Jan 2022Release notes
Open source →- Make
SendStream::poll_capacitynever returnOk(Some(0))(#596) - Fix panic when receiving already reset push promise (#597)
- Make
-
0.3.1007 Jan 2022Release notes
Open source →- Add
Error::is_go_away()andError::is_remote()methods. - Fix panic if receiving malformed PUSH_PROMISE with stream ID of 0.
- Add
-
0.3.909 Dec 2021 -
0.3.808 Dec 2021Release notes
Open source →- Add "extended CONNECT support". Adds
h2::ext::Protocol, which is used for request and response extensions to connect new protocols over an HTTP/2 stream. - Add
max_send_buffer_sizeoptions to client and server builders, and a default of ~400MB. This acts like a high-water mark for thepoll_capacity()method. - Fix panic if receiving malformed HEADERS with stream ID of 0.
- Add "extended CONNECT support". Adds
-
0.3.722 Oct 2021Release notes
Open source →- Fix panic if server sends a malformed frame on a stream client was about to open.
- Fix server to treat
:statusin a request as a stream error instead of connection error.
-
0.3.630 Sep 2021Release notes
Open source →- Fix regression of
h2::Errorthat were created viaFrom<h2::Reason>not returning their reason code inError::reason().
- Fix regression of
-
0.3.529 Sep 2021Release notes
Open source →- Fix sending of very large headers. Previously when a single header was too big to fit in a single
HEADERSframe, an error was returned. Now it is broken up and sent correctly. - Fix buffered data field to be a bigger integer size.
- Refactor error format to include what initiated the error (remote, local, or user), if it was a stream or connection-level error, and any received debug data.
- Fix sending of very large headers. Previously when a single header was too big to fit in a single
-
0.3.420 Aug 2021Release notes
Open source →- Fix panic when encoding header size update over a certain size.
- Fix
SendRequestto wake up connection when dropped. - Fix potential hang if
RecvStreamis placed in the request or responseextensions. - Stop calling
Instant::nowif zero reset streams are configured.
-
0.3.329 Apr 2021Release notes
Open source →- Fix client being able to make
CONNECTrequests without a:path. - Expose
RecvStream::poll_data. - Fix some docs.
- Fix client being able to make
-
0.3.225 Mar 2021Release notes
Open source →- Fix incorrect handling of received 1xx responses on the client when the request body is still streaming.
-
0.3.126 Feb 2021Release notes
Open source →- Add
Connection::max_concurrent_recv_streams()getter. - Add
Connection::max_concurrent_send_streams()getter. - Fix client to ignore receipt of 1xx headers frames.
- Fix incorrect calculation of pseudo header lengths when determining if a received header is too big.
- Reduce monomorphized code size of internal code.
- Add
-
0.3.023 Dec 2020Release notes
Open source →- Update to Tokio v1 and Bytes v1.
- Disable
tracing'slogfeature. (It can still be enabled by a user in their ownCargo.toml.)
-
0.2.723 Oct 2020Release notes
Open source →- Fix stream ref count when sending a push promise
- Fix receiving empty DATA frames in response to a HEAD request
- Fix handling of client disabling SERVER_PUSH
-
0.2.613 Jul 2020Release notes
Open source →- Integrate
tracingdirectly wherelogwas used. (For 0.2.x,logs are still emitted by default.)
- Integrate
-
0.2.506 May 2020 -
0.2.430 Mar 2020 -
0.2.325 Mar 2020Release notes
Open source →- Fix server being able to accept
CONNECTrequests without:schemeor:path. - Fix receiving a GOAWAY frame from updating the recv max ID, it should only update max send ID.
- Fix server being able to accept
-
0.2.203 Mar 2020 -
0.2.106 Dec 2019 -
0.2.003 Dec 2019Release notes
Open source →- Add
server::Connection::set_initial_window_sizeandclient::Connection::set_initial_window_sizewhich can adjust theINITIAL_WINDOW_SIZEsetting on an existing connection (#421). - Update to
httpv0.2. - Update to
tokiov0.2. - Change
unstable-streamfeature tostream. - Change
ReserveCapacitytoFlowControl(#423). - Remove
From<io::Error>forError.
- Add
-
0.2.0-alpha.301 Oct 2019 pre-release -
0.2.0-alpha.220 Sep 2019 pre-releaseRelease notes
Open source →- Add server support for
PUSH_PROMISEs (#327). - Update to tokio
0.2.0-alpha.5. - Change
streamfeature tounstable-stream.
- Add server support for
-
0.2.0-alpha.104 Sep 2019 pre-releaseRelease notes
Open source →- Update from
futures0.1 tostd::future::Future. - Update
AsyncRead/AsyncWritetotokio-io0.2 alpha. - Change
Streamimplementations to be optional, default disabled. Specific async and poll functions are now inherent, andStreamcan be re-enabled with thestreamcargo feature.
- Update from
-
0.1.2626 Jul 2019Nothing published for this version
-
0.1.2528 Jun 2019Release notes
Open source →- Fix to send a
RST_STREAMinstead ofGOAWAYif receiving a frame on a previously closed stream. - Fix receiving trailers without an end-stream flag to be a stream error instead of connection error.
- Fix to send a