HTTP/2 C library and tools

Nghttp2 v1.33.0

We have released nghttp2 v1.33.0.


RFC 8336 ORIGIN frame support has been added.

The value of SETTINGS_MAX_CONCURRENT_STREAMS is now set to unlimited if a remote peer does not explicitly include it in SETTINGS frame. Previously, it remains the initial value, 100.


Configuring local address for cleartext connection has been added.


mruby parameter has been added to backend option. mruby parameter specifies the path to mruby script file which is executed when the particular pattern is selected.

Fix bug which causes worker process to abort if neverbleed daemon process is killed before deleting SSL_CTX object.

Fix bug that stream is reset if request body is arrived before backend is selected.

Nghttp2 v1.32.1

We have released nghttp2 v1.32.1.


nghttp2_session_set_stream_user_data now works for a stream which is not created yet, but the request which creates the stream is queued.

Nghttp2 v1.32.0

We have released nghttp2 v1.32.0.


The incorrect validation of padding against frame boundary has been fixed.

Now once nghttp2_session went terminal state, it ignores all inputs.

The incoming HTTP status code 101 is now disallowed.


ENABLE_STATIC_LIB option is added to cmake build in order to build static library.


neverbleed has been updated to compile with LibreSSL 2.7.


Now client sends TLS SNI extension.


The nghttp2 applications can now compile with LibreSSL 2.7 and without TLS NPN extension support.


h2load now exits early with the error if --rate and --duration are used at the same time.

Nghttp2 v1.31.1

We have released nghttp2 v1.31.1.

This release addresses following security issue.

Security Advisory

CVE-2018-1000168: Denial of service due to NULL pointer dereference.


If ALTSVC frame is received by libnghttp2 and it is larger than it can accept, the pointer field which points to ALTSVC frame payload is left NULL. Later libnghttp2 attempts to access another field through the pointer, and gets segmentation fault.

ALTSVC frame is defined by RFC 7838.

The largest frame size libnghttp2 accept is by default 16384 bytes.

Receiving ALTSVC frame is disabled by default. Application has to enable it explicitly by calling nghttp2_option_set_builtin_recv_extension_type(opt, NGHTTP2_ALTSVC).

Transmission of ALTSVC is always enabled, and it does not cause this vulnerability.

ALTSVC frame is expected to be sent by server, and received by client as defined in RFC 7838.

Client and server are both affected by this vulnerability if the reception of ALTSVC frame is enabled. As written earlier, it is useless to enable reception of ALTSVC frame on server side. So, server is generally safe unless application accidentally enabled the reception of ALTSVC frame.

Affected Versions

  • Affected versions: nghttp2 >= 1.10.0 and nghttp2 <= v1.31.0
  • Not affected versions: nghttp2 >= 1.31.1

The Solution

Upgrade to nghttp2 v1.31.1.

If the upgrade cannot be possible:

For client, disable ALTSVC, removing the call to nghttp2_option_set_builtin_recv_extension_type(opt, NGHTTP2_ALTSVC)

For server, because it is never expected to receive ALTSVC, just remove nghttp2_option_set_builtin_recv_extension_type(opt, NGHTTP2_ALTSVC).

Time Line

It was first reported to the nghttp2 team April 4 2018.

nghttp2 v1.31.1 was released on April 12 2018.


Reported by Jordan Zebor at F5 Networks, and James M Snell from Node.js project. Fixed by the nghttp2 team.

Thank you for all who involved.

This security advisory format is inspired from curl/libcurl project.

Nghttp2 v1.31.0

We have released nghttp2 v1.31.0.


nghttp2_session_set_user_data() is added to set new user data to nghttp2_session.


The option --verify-client-tolerate-expired has been added, which makes nghttpx accept expired client certificate.

tls_client_not_before, and tls_client_not_after are now available to mruby scripting. They return NotBefore, and NotAfter of client certificate respectively.

Nghttp2 v1.30.0

We have released nghttp2 v1.30.0.


This release fixes the bug so that PING frame can be sent after GOAWAY.


This release fixes the bug that set_header method in mruby script wrongly overwrites other header fields.

upgrade-scheme parameter has been added to backend option to workaround the issue that a backend server requires that HTTP/2 :scheme pseudo header field value should be https.

This release fixes the bug that ALPN validation does not occur if client does not send TLS ALPN extension.

To more compliant to RFC 8297, nghttpx now remembers which resource is pushed per a single request.

Nghttp2 v1.29.0

We have released nghttp2 v1.29.0.


NGHTTP2_REFUSED_STREAM is now used as an error code passed to nghttp2_on_stream_close_callback for streams which are closed by GOAWAY to indicate that they are safely retried.


SPDY related code was completely removed.


The commit which breaks load balancing among HTTP/2 backend in some situations has been reverted.

The default value of --api-max-request-body option has been increased to 32MiB.

The time to load the large number of backend options has been greatly improved.

The crash with --backend-http-proxy-uri option has been fixed.

Nghttp2 v1.28.0

We have released nghttp2 v1.28.0.


nghttp2_error_callback2 callback function has been added. It is an extended version of the existing nghttp2_error_callback. The new callback takes a new parameter which indicates the error code. nghttp2_error_callback is now deprecated.


This release officially deprecates spdylay support. The next release, v1.29.0, will remove all SPDY related code.


Cookie based session affinity has been implemented. To use cookie based session affinity, specify affinity=cookie in backend option. affinity-cookie-name parameter must also be specified to specify a name of cookie. affinity-cookie-path and affinity-cookie-secure control a path and secure attributes of cookie respectively.

The bug that backend connection might be stalled on retry has been fixed.

The existing TLS related variables available to the access log are now exposed to mruby Env object. This release also adds new TLS related variables: $tls_client_fingerprint_sha256, $tls_client_fingerprint_sha1, $tls_client_subject_name, $tls_client_issuer_name, and $tls_client_serial. They are available to both mruby, and the access log.

Nghttp2 v1.27.0

We have released nghttp2 v1.27.0.


LazyHamster fixed accidental compiler flags concatenation for MSVC.

Mike Lothian sent us a patch to reduce libxml2 version requirement to 2.6.26.


Daniel Evers added libnghttp2_asio support for Windows / MinGW.


HTTP/2 header fields are now printed with --verbose option.


An HTTP non-final response is now sent to HTTP/1.1 or HTTP/2 client only.

Nghttp2 v1.26.0

We have released nghttp2 v1.26.0.


Soham Sinha added timing-based load-testing in h2load. This new method performs load-testing in terms of a given duration instead of a pre-defined number of requests. The new option --duration specifies how long the load-testing takes. For example, --duration=10 makes h2load perform load-testing against a server for 10 seconds. You can also specify a “warming-up” period with --warm-up-time. If --duration is used, -n option is ignored.