v0.47.0
New Features
This release adds support for HTTP/3 Trailers, for both the server and the client side (#4581, #4630, #4656, #4639). Trailers work exactly the same way as for HTTP/1.1 and HTTP/2.
A big thank you to @sudorandom for contributing this feature!
Fixes
- idle timeout calculation when the peer sends a
max_idle_timeout
of 0 (or omits the transport parameter): #4666 - fix handling of corrupted coalesced 1-RTT packets: #4663
- qpack: don't reject literal field lines with name references if
N
bit is set to 1: quic-go/qpack#52 - http3: correctly set the
http.Response.ContentLength
on responses that don't set theContent-Length
header: #4645 - http3: reject connection-specific header fields (
Connection
,Keep-Alive
,Proxy-Connection
,Transfer-Encoding
,Upgrade
andTE != "trailers"
): #4646, #4655
Breaking Changes
quic.VersionNumber
andlogging.VersionNumber
were removed: #4627
Heads-Up
@sukunrt recently discovered and reported a race condition in the new time.Timer
stopping logic introduced in Go 1.23. This manifests as a connection deadlock in quic-go. See #4659 and golang/go#69312 for more details. The new behavior is enabled when compiling with Go 1.23.x, and when the Go version in go.mod
is set to Go 1.23.x.
Until this issue is fixed, it is recommended to either use Go 1.22.x, or to use GODEBUG="asynctimerchan=1"
when compiling quic-go.
Update (Oct 1st 2024)
The Go project backported the fix (golang/go#69333) to the 1.23 branch, and released it in Go 1.23.2. This resolves above-mentioned issue. quic-go can now be built with Go 1.23.2, without the need to set any GODEBUG flags.
Changelog
- remove deprecated quic.VersionNumber and logging.VersionNumber by @marten-seemann in #4627
- ci: migrate race detector test to GitHub Actions by @marten-seemann in #4635
- bump Go version in go.mod, stop testing on Go 1.21 by @marten-seemann in #4633
- http3: add client-side HTTP Trailer support by @sudorandom in #4581
- http3: reject pseudo header fields in trailers by @marten-seemann in #4639
- http3: reject the Transfer-Encoding header field by @marten-seemann in #4646
- http3: set ContentLength to -1 if no Content-Length header is set by @marten-seemann in #4645
- interop: simplify API of http09.Server by @marten-seemann in #4651
- update qpack to v0.5.0 by @marten-seemann in #4653
- http3: reject connection-specific header fields, check value of TE by @marten-seemann in #4655
- interop: fix server setup for the HTTP/0.9 server by @marten-seemann in #4658
- protocol: use the packet number decoding / encoding logic from the RFC by @marten-seemann in #4661
- fix handling of corrupted coalesced 1-RTT packets by @marten-seemann in #4663
- http3: add HTTP Trailer support for servers by @sudorandom in #4630
- ci: control concurrency of the interop Docker image builder by @marten-seemann in #4665
- update qpack to v0.5.1 by @marten-seemann in #4664
- http3: initialize trailer map with empty trailer entries when parsing the header by @sudorandom in #4656
- http3: avoid re-parsing of the Content-Length header for responses by @marten-seemann in #4648
- fix calculation of idle timeout when the peer set max_idle_timeout to 0 by @marten-seemann in #4666
New Contributors
- @sudorandom made their first contribution in #4581
Full Changelog: v0.46.0...v0.47.0