Do not download the archive files generated by GitHub. They do not work. Please download the signed and versioned tar balls, such as nghttp2-1.68.1.tar.gz.
This release includes security advisory.
CVE-2026-27135: Denial of service: Assertion failure due to the missing state validation
For more information, read the security advisory.
]]>Do not download the archive files generated by GitHub. They do not work. Please download the signed and versioned tar balls, such as nghttp2-1.68.0.tar.gz.
This release adds more glitch counters for the unexpected builtin extension frames.
This release changes the default QUIC window-bits to 24 to reduce the fragmentation on huge packet losses.
This release makes the supported groups configurable with --groups
option.
TLSv1.0 and TLSv1.1 support has been dropped.
ML-DSA certificates are now selected over ECDSA and RSA. ML-DSA certificates are supported by OpenSSL and wolfSSL TLS backends.
Certificate selection based on client capability is extended to wolfSSL and BoringSSL.
--group option has been added. --ecdh-curves option has been
deprecated, and if it is used, it is treated as if --group option is
used.
Do not download the archive files generated by GitHub. They do not work. Please download the signed and versioned tar balls, such as nghttp2-1.67.1.tar.gz.
Remove session_update_glitch_ratelim call from
session_handle_invalid_stream2. Because that makes error handling
quite difficult because it might be called in the nested function
calls, and that might lead to the unexpected result. It seems to me
that this was accidentally added.
Do not download the archive files generated by GitHub. They do not work. Please download the signed and versioned tar balls, such as nghttp2-1.67.0.tar.gz.
This release adds nghttp2_rand_callback, and the internal hash map
is initialized with the seed sampled from this callback.
Some stream errors are now promoted to the connection errors. This means that an event that previously just resets a single stream now closes a connection entirely. The promoted errors are mostly implementation errors.
We have some contradictory specifications around
nghttp2_on_invalid_header and nghttp2_on_invalid_header2
callbacks. nghttp2_on_invalid_header says that if it is omitted, a
stream is reset. Meanwhile, nghttp2_on_invalid_header2 says that if
it is omitted, invalid field is silently ignored. In actual
implementation, if both omitted, we treat it as stream error. In
practice, it is often required not to bail out if invalid header is
received. In this change, if both callbacks are omitted, invalid
field is silently ignored as the documentation of
nghttp2_on_invalid_header2 says.
The “glitch” counter has been introduced. Any suspicious activity such as DATA frames to a stream which does not exist are counted to so called “glitch” counter. If it increases more than the configured rate, GOAWAY is sent and the connection is closed.
]]>Do not download the archive files generated by GitHub. They do not work. Please download the signed and versioned tar balls, such as nghttp2-1.66.0.tar.gz.
nghttp2_submit_rst_stream now does not add RST_STREAM frame more
than once.
The support for the draft HTTP/2 ALPNs (e.g., h2-14, h2-16) have
been removed.
This release fixes build failure with rubydomain namespace.
QUIC is now enabled with OpenSSL >= 3.5.0.
QUIC is now enabled with OpenSSL >= 3.5.0.
The bug in Forwarded By parameter value that exhibits when a frontend socket listens on wildcard address has been fixed.
The rate limiting for incoming QUIC traffic has been implemented.
--read-rate and --read-burst options are now applied to QUIC
connection as well.
Each worker thread has its listening TCP sockets.
The usage counts of a weight group are preserved after replacing backends with backendconfig API if the name and weight of the groups under the pattern have not changed.
OCSP stapling feature has been removed.
TLS session cache via memcached has been removed.
Support for SSLKEYLOGFILE has been added.
Do not download the archive files generated by GitHub. They do not work. Please download the signed and versioned tar balls, such as nghttp2-1.65.0.tar.gz.
RFC 7540 Priorities implementation has been removed. Here is the summary of the behavioral changes in the public API functions:
nghttp2_session_change_stream_priority: This function is noop. It
always returns 0.nghttp2_session_create_idle_stream: This function is noop. It
always returns 0.nghttp2_submit_request: pri_spec is ignored.nghttp2_submit_request2: pri_spec is ignored.nghttp2_submit_headers: pri_spec is ignored.nghttp2_submit_priority: This function is noop. It always returns
nghttp2_stream_get_parent: This function always returns NULL.nghttp2_stream_get_next_sibling: This function always returns
NULL.nghttp2_stream_get_previous_sibling: This function always returns
NULL.nghttp2_stream_get_first_child: This function always returns NULL.nghttp2_stream_get_weight: This function always returns
NGHTTP2_DEFAULT_WEIGHT.nghttp2_stream_get_sum_dependency_weight: This function always
returns 0.nghttp2_option_set_server_fallback_rfc7540_priorities and
nghttp2_option_set_no_closed_streams have also been deprecated, and
have no effect.
QNX build support has been added.
Disable src tests if BUILD_TESTING is OFF.
url-parser has been replaced with urlparse.
Account for bytes on closing connections.
nghttp now does not create the initial dependency tree. --no-dep and
--no-rfc7540-pri options have been deprecated.
nghttp now always sends NGHTTP2_SETTINGS_NO_RFC7540_PRIORITIES
HTTP/2 setting. --extpri option has been added to set priority for
a given URI.
This change deprecates --no-rfc7540-pri option.
SETTINGS_NO_RFC7540_PRIORITIES HTTP/2 setting is now always sent.
Do not download the archive files generated by GitHub. They do not work. Please download the signed and versioned tar balls, such as nghttp2-1.64.0.tar.gz.
The internal :authoriy and host field value validation now treats
@ as invalid. nghttp2_check_authority still treats it as a valid
character.
This release fixes c-ares v1.34.0 version detection failure.
This release fixes race condition on h1 connection close.
It also fixes UDP datagram send/recv metric.
]]>Do not download the archive files generated by GitHub. They do not work. Please download the signed and versioned tar balls, such as nghttp2-1.63.0.tar.gz.
Compile error emitted by old compilers is suppressed.
nghttp2.h undefines NGHTTP2_NO_SSIZE_T if BUILDING_NGHTTP2 is
defined.
wolfSSL support has been added.
]]>Do not download the archive files generated by GitHub. They do not work. Please download the signed and versioned tar balls, such as nghttp2-1.62.0.tar.gz.
]]>This release includes security advisory.
CVE-2024-28182: Reading unbounded number of HTTP/2 CONTINUATION frames to cause excessive CPU usage
For more information, read the security advisory.
For other changes, refer to v1.61.0 release notes.
Do not download the archive files generated by GitHub. They do not work. Please download the signed and versioned tar balls, such as nghttp2-1.61.0.tar.gz.
]]>RFC 7540 priorities (aka stream dependencies) APIs have been deprecated. They work just like before, but in the future release after the end of 2024, the functionality is removed, and the deprecated APIs start behaving differently. See the API documentation for details. RFC 7540 priorities have been deprecated by RFC 9113. Consider migrating RFC 9218 extensible prioritization scheme.
The APIs that use ssize_t, including structs and callback functions,
have been deprecated. New APIs that use nghttp2_ssize are
introduced as a replacement. The usage of ssize_t is problematic
for several reasons. Some platforms do not define ssize_t. The
minimum value of ssize_t that POSIX requires is -1 which makes
nghttp2 error code out of range. nghttp2_ssize is an alias of
ptrdiff_t that is in C standard and covers our error code range.
New code should use new nghttp2_ssize APIs. The existing
applications should consider migrating to new APIs.
The deprecated ssize_t APIs continue to work for backward
compatibility.
Here is the summary of the deprecated APIs and their replacements:
Callback functions:
nghttp2_data_source_read_callback => nghttp2_data_source_read_callback2nghttp2_data_source_read_length_callback => nghttp2_data_source_read_length_callback2nghttp2_pack_extension_callback => nghttp2_pack_extension_callback2nghttp2_recv_callback => nghttp2_recv_callback2nghttp2_select_padding_callback => nghttp2_select_padding_callback2nghttp2_send_callback => nghttp2_send_callback2Structs:
nghttp2_data_provider => nghttp2_data_provider2Functions:
nghttp2_hd_deflate_hd => nghttp2_hd_deflate_hd2nghttp2_hd_deflate_hd_vec => nghttp2_hd_deflate_hd_vec2nghttp2_hd_inflate_hd2 => nghttp2_hd_inflate_hd3nghttp2_pack_settings_payload => nghttp2_pack_settings_payload2nghttp2_session_callbacks_set_data_source_read_length_callback => nghttp2_session_callbacks_set_data_source_read_length_callback2nghttp2_session_callbacks_set_pack_extension_callback => nghttp2_session_callbacks_set_pack_extension_callback2nghttp2_session_callbacks_set_recv_callback => nghttp2_session_callbacks_set_recv_callback2nghttp2_session_callbacks_set_select_padding_callback => nghttp2_session_callbacks_set_select_padding_callback2nghttp2_session_callbacks_set_send_callback => nghttp2_session_callbacks_set_send_callback2nghttp2_session_mem_recv => nghttp2_session_mem_recv2nghttp2_session_mem_send => nghttp2_session_mem_send2nghttp2_submit_data => nghttp2_submit_data2nghttp2_submit_request => nghttp2_submit_request2nghttp2_submit_response => nghttp2_submit_response2For those applications that do not want to see ssize_t in nghttp2.h
header file at all, define NGHTTP2_NO_SSIZE_T macro before including
nghttp2.h. It hides all ssize_t APIs.
cmake build and install trees are now fixed.
The following dependencies have been updated:
CUnit has been replaced with ngtcp2/munit. munit is pulled via git submodule.
The flags to build applications with libbrotli have been added.
llhttp has been updated.
mruby is updated to v3.3.0.
--sni option has been added.
The certificate compression support with boringssl (or aws-lc) and libbrotli has been added.
]]>This release adds API to get and parse RFC 9218 priority.
nghttp2_select_next_protocol() has been deprecated. Use
nghttp2_select_alpn() instead.
The following dependencies have been updated:
h2load now considers all h2 HEADERS when counting bytes and recording TTFB.
This release fixes the bug that TTFB is not recorded if h3 stream has no data.
h2load now ignores 1xx status code.
IPv6 address is now enclosed by square brackets when set in
:authority header field.
This release adds SSL_CTX_set_recv_max_early_data() call which
OpenSSL requires.
__FILE_NAME__ macro is preferred if available.
nghttpx now propagates stream priority from backend to frontend.
This release fixes the bug that nghttpx sends QUIC RESET_STREAM when
it receives RESET_STREAM from client.
This release drops old OpenSSL (< 1.1.1) support.
Now bundled applications can be built with aws-lc.
]]>This release fixes build issues with cygwin and mingw.
This release speeds up warning option detection with cmake.
The following dependencies have been updated:
neverbleed has been updated.
This release introduces stricter transfer-encoding checks.
Enable http3 test with cmake.
]]>This release includes security advisory.
CVE-2023-44487: HTTP/2 Rapid Reset
For more information, read the security advisory.
This release has a fix to mitigate CVE-2023-44487: HTTP/2 Rapid Reset.
It has reasonable amount of default budgets for incoming RST_STREAM
frames. Application can tune the rate limit by using
nghttp2_option_set_stream_reset_rate_limit. It can also implement
its own rate limit by implementing nghttp2_on_frame_recv_callback
and check RST_STREAM frame.
This release fixes the bug that --single-process does not work.
It also fixes the bug that TLS connection is not rate limited.
The following dependencies have been updated:
llhttp has been updated.
Rework is done in functions that send ECN bits.
--frontend-quic-congestion-controller=bbr2 has been renamed to
--frontend-quic-congestion-controller=bbrv2.
Fix issue that CMSG_DATA does not necessarily return an aligned pointer.
]]>This release includes security advisory.
CVE-2023-35945: HTTP/2 memory leak in nghttp2 codec
For more information, read the security advisory.
This CVE was filed by envoyproxy/envoy project, and has already been made public, and we did not take usual security procedure. See below why.
This release fixes memory leak that happens when PUSH_PROMISE or
HEADERS frame cannot be sent, and nghttp2_on_stream_close_callback
fails with a fatal error. For example, if GOAWAY frame has been
received, a HEADERS frame that opens new stream cannot be sent.
This issue has already been made public via CVE-2023-35945 issued by envoyproxy/envoy project. During embargo period, the patch to fix this bug was accidentally submitted to nghttp2/nghttp2 repository. And they decided to disclose CVE early. I was notified just 1.5 hours before disclosure. I had no time to respond.
PoC described in CVE is quite simple, but I think it is not enough to
trigger this bug. While it is true that receiving GOAWAY prevents a
client from opening new stream, and nghttp2 enters error handling
branch, in order to cause the memory leak,
nghttp2_session_close_stream function must return a fatal error.
nghttp2 defines 2 fatal error codes:
NGHTTP2_ERR_NOMEMNGHTTP2_ERR_CALLBACK_FAILURENGHTTP2_ERR_NOMEM, as its name suggests, indicates out of memory.
It is unlikely that a process gets short of memory with this simple
PoC scenario unless application does something memory heavy
processing.
NGHTTP2_ERR_CALLBACK_FAILURE is returned from application defined
callback function (nghttp2_on_stream_close_callback, in this case),
which indicates something fatal happened inside a callback, and a
connection must be closed immediately without any further action. As
nghttp2_on_stream_close_error_callback documentation says, any error
code other than 0 or NGHTTP2_ERR_CALLBACK_FAILURE is treated as
fatal error code. More specifically, it is treated as if
NGHTTP2_ERR_CALLBACK_FAILURE is returned. I guess that envoy
returns NGHTTP2_ERR_CALLBACK_FAILURE or other error code which is
translated into NGHTTP2_ERR_CALLBACK_FAILURE.
The following dependencies have been updated:
This release fixes build error without libev.
llhttp has been updated.
Cross-compiling mruby is now supported.
UDP_GRO is enabled for QUIC socket.
The initial QUIC packet number is now randomized.
UDP_GRO is enabled for QUIC socket.
]]>The following dependencies have been updated:
This release fixes HTTP/3 upload stall bug.
]]>libnghttp2 uses ngtcp2/sfparse to parse Structured Field Values.
The following dependencies have been updated:
Bumped mruby to 3.2.0.
nghttpx now sends NEW_TOKEN on path change.
This release fixes numeric hostname verification in peer certificate.
When quitting, nghttpx now waits for all worker processes to stop. Previously, we just exit the event loop when the last process exits. But the because of the bug, it does not work as intended.
nghttpx logs a correct PID on fork.
nghttpx now waits for new worker process to be ready before sending graceful shutdown event to the existing worker processes to avoid down time during configuration reload.
Fixes the bug that causes 400 response after HTTP upgrade failure.
]]>sphinx_rtd_theme has been removed from the repository and archive.
The following dependencies have been updated:
CMake build now checks core and extra components to find libevent.
The deprecated Python bindings has been removed.
The deprecated libnghttp2_asio has been removed.
llhttp and neverbleed have been updated.
This release fixes the bug that stalls TLS connection.
This release adds more http3 integration tests.
]]>