We released nghttp2 v1.14.0. We summarizes the changes below per category.
libnghttp2
Wenfeng Liu contributed several commits to mainly HPACK related code.
Most notably, Wenfeng added nghttp2_hd_deflate_hd_vec()
function,
which can takes multiple output buffers to encode HTTP header fields,
in a same spirit of writev(2)
. Wenfeng also cleaned up source code,
and added optimizations.
We added nghttp2_on_invalid_header_callback
to pass the invalid
header fields to application. We say header field is invalid if it
contains a character which is now allowed in header field.
Previously, libnghttp2 silently ignored them. Now application can use
this callback to catch these header fields, and it can reset a stream
if it wishes.
HTTP/2 priority handling is complex thing, but we fixed a bug that libnghttp2 performs wrong tree operation to avoid dependency cycle. https://tools.ietf.org/html/rfc7540#section-5.3.3 explains how to transform dependency tree to avoid circular dependency. Previously, we wrongly always moved the dependent stream under the root stream. The correct destination is the parent stream of the stream to reprioritize. This is not a security bug.
We have deprecated NGHTTP2_INITIAL_MAX_CONCURRENT_STREAMS
macro,
which was defined as INT32_MAX. Actually, the SETTINGS value can
contain 32 bit unsigned integer, it is not really an initial value.
We think deprecation does not affect most of the application, since
typically they requires much lower concurrent stream limit (say, 100).
We have tightened up stream state handling for server side session, and now nghttpx and nghttpd can pass all h2spec tests with strict mode enabled.
Documentation
We removed old documentation about HPACK differential coding. It was removed when we ditched reference set from HPACK specification.
We also mention about ALPN support in nghttpx HOW-TO.
nghttpx
We have got several bug report about the issue that the backend connection cannot be established. We added several WARN level log messages to debug this situation easier.
Previously, we silently changed pushed stream’s priority if it is CSS, Javascript, or html, by mutating server side priority tree, so that they can be sent along with associated resource (usually, parent html). There is a discussion in httpbis mailing list which argues that dependency tree is for client, and changing it in server side is not what client expects. Ideally, it is a browser’s job to prioritize pushed resource, but we need 1 RTT to get this PRIORITY frame from browser. We will work on better approach how to prioritize pushed stream in initial phase.
nghttpx can now log the backend host and port in access log file. See
--accesslog-format
option for more details.
We have fixed the bug that api
and healthmon
parameter do not work
with --http2-proxy
option.
nghttpx now reloads configuration file when it receives SIGHUP
.
nghttp
nghttp now accepts multiple -p
option to set weight for
corresponding URI in command-line.
deflatehd
We fixed it so that it only emits dynamic header table size update when header table size is changed from default.