Releases: quic-go/quic-go
v0.48.1
This patch releases fixes a panic in the shutdown logic of the http3.Server
that was introduced in v0.48.0. Thanks to @WeidiDeng for the fix!
Changelog
- http3: fix graceful server shutdown by @WeidiDeng in #4707
Full Changelog: v0.48.0...v0.48.1
v0.48.0
New Features
The http3.Server
now supports graceful shutdown: calling Shutdown
stops the server from accepting new connections, and new HTTP requests on existing connections. It continues serving existing connections until all active requests have completed (or the context is canceled).
On the wire, graceful shutdown is signaled by sending a GOAWAY frame. This tells the client that the server will not accept any new requests. Clients are expected to finish existing requests and then close the QUIC connection.
Client-side support for graceful shutdown is not implemented yet (see #153).
Breaking Changes
- The HTTP/3 client API was made more consistent with the Go standard library's HTTP/1 and HTTP/2 naming: #4693
- The deprecated
qlog.DefaultTracer
function was removed: #4697 - The deprecated
http3.Server.SetQuicHeader
method andhttp3.ListenAndServe
were removed: #4698 http3.Server.Close
now closes immediately all QUIC connections: #4689
Note that all connection passed to http3.Server.ServeQUICConn
need to be closed by the caller, before calling http3.Server.Close
.
Notable Fixes
- Canceling a stream after connection termination now doesn't change the error returned from
Stream.Write
andStream.Read
(thanks to @sukunrt for the fix): #4673 - HTTP/3 Capsule Parsing logic didn't work for capsules that weren't read with a single
Read
call: #4683
Behind The Scenes
We've started migrating our test suite away from Ginkgo (tracking issue: #3652), and towards a more idiomatic approach to testing Go code (using require). This is a massive endevour, as our test suite is around 47k LOC.
In this release, a large number of Go packages were translated: #4640, #4641, #4642, #4643, #4649, #4650, #4652, #4662, #4670, #4671, #4675, #4667, #4676, #4680, #4681.
In the upcoming release(s), we will continue this work.
Changelog
- qlog: migrate tests away from Ginkgo by @marten-seemann in #4640
- logging: migrate tests away from Ginkgo by @marten-seemann in #4641
- qerr: move away from Ginkgo by @marten-seemann in #4649
- qtls: migrate tests away from Ginkgo by @marten-seemann in #4642
- interop: move away from Ginkgo by @marten-seemann in #4652
- protocol: move away from Ginkgo by @marten-seemann in #4650
- quicvarint: migrate tests away from Ginkgo by @marten-seemann in #4662
- ringbuffer: migrate test away from Ginkgo by @marten-seemann in #4671
- testdata: migrate tests away from Ginkgo by @marten-seemann in #4670
- utils: remove unused methods and constructor from RTTStats by @marten-seemann in #4672
- wire: migrate tests away from Ginkgo by @marten-seemann in #4643
- stream: don't cancel stream after shutdown by @sukunrt in #4673
- utils: migrate tests away from Ginkgo by @marten-seemann in #4675
- versionnegotiation: migrate tests away from Ginkgo by @marten-seemann in #4676
- proxy: migrate tests away from Ginkgo by @marten-seemann in #4680
- fuzzing: migrate tests for helper function away from Ginkgo by @marten-seemann in #4681
- http3: fix capsule parsing by @marten-seemann in #4683
- http3: immediately close all connections on Server.Close by @marten-seemann in #4689
- handshake: migrate tests away from Ginkgo by @marten-seemann in #4667
- http3: send GOAWAY when server is shutting down by @WeidiDeng and @marten-seemann in #4691
- http3: improve the client API by @marten-seemann in #4693
- http3: export the Capsule-Protocol header value by @marten-seemann in #4690
- http3: don't expose ClientConn.HandleUnidirectionalStreams by @marten-seemann in #4695
- http3: improve documentation for Transport and ClientConn by @marten-seemann in #4696
- qlog: remove deprecated DefaultTracer function by @marten-seemann in #4697
- http3: remove deprecated ListenAndServe and Server.SetQuicHeader by @marten-seemann in #4698
- http3: add (deprecated) type aliases for RoundTripper and SingleDestinationRoundTripper by @marten-seemann in #4699
- http3: output panic stack trace as a string by @marten-seemann in #4700
- http3: rename Server.CloseGracefully to Shutdown by @marten-seemann in #4701
Full Changelog: v0.47.0...v0.48.0
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
v0.46.0
New Features
- The
http3.Server
now has anIdleTimeout
field: #4587. It works analogous to its HTTP/2 standard library equivalent: If no requests are received for the idle timeout period, the underlying QUIC connection is closed. Thanks to @rs for implementing. - The qlog file format was updated to the current qlog draft, which now uses JSON sequences (JSON-SEQ): #4609. qlog files now have the file extension
.sqlog
.
Breaking Changes
logging.VersionNumber
was renamed tologging.Version
(#4621), mirroring a similar renaming ofquic.VersionNumber
toquic.Version
introduced in an earlier releaseinternal_error
TLS alerts are now sent as QUIC CRYPTO_ERRORs (and not INTERNAL_ERRORs): #4601
Other Notable Changes
The stream logic for queueing stream-related control frames (RESET_STREAM, STOP_SENDING, MAX_STREAM_DATA, STREAM_DATA_BLOCKED) was completely rewritten. This makes quic-go more resilient to memory exhaustion attacks similar to those that we've seen earlier this year (1 and 2). It also enables further frame packing optimizations in the future.
Changelog
- metrics: create a new tracer on every call of DefaultConnectionTracer by @marten-seemann in #4560
- metrics: use the default metrics tracer in integration tests by @marten-seemann in #4562
- example: remove Dockerfile by @marten-seemann in #4568
- http3: fix race condition between Server.Serve and Server.Close by @marten-seemann in #4572
- http3: allow re-dialing of connection after a dial error by @marten-seemann in #4573
- fix stream documentation for StreamError return values by @mengelbart in #4575
- build(deps): bump docker/build-push-action from 5 to 6 by @dependabot in #4576
- use a net.ErrClosed when returning Accept from a closed server by @marten-seemann in #4569
- handshake: ignore unknown QUIC events from crypto/tls by @marten-seemann in #4577
- introduce a StreamLimitReachedError for Connection.Open{Uni}Stream by @marten-seemann in #4579
- ci: use Go 1.23rc2 for unit and integration tests by @marten-seemann in #4571
- handshake: remove unneeded tokenProtector interface by @marten-seemann in #4585
- ackhandler: optimize received packet tracking by @marten-seemann in #4584
- move connection logging to a separate file, absorb logutils package by @marten-seemann in #4586
- simplify handling of CRYPTO frames, remove cryptoDataHandler interface by @marten-seemann in #4588
- wire: optimize parsing of long header packets by @marten-seemann in #4589
- remove trivial IPv4 helper function by @marten-seemann in #4591
- wire: simplify packet number parsing, remove utils.ByteOrder interface by @marten-seemann in #4590
- utils: remove scarcely used time helper functions by @marten-seemann in #4593
- remove mock TokenStore implementation by @marten-seemann in #4597
- remove unused framer interface by @marten-seemann in #4599
- refactor frame packing to logic to not access the streams map by @marten-seemann in #4596
- ackhandler: reduce allocations for tracking sent packets by @marten-seemann in #4602
- mark stream completed when CancelWrite is called after receiving STOP_SENDING by @sukunrt in #4605
- simplify generation of STREAM_DATA_BLOCKED frames by @marten-seemann in #4608
- reduce allocations when handling crypto data by @marten-seemann in #4615
- handshake: remove gomock tls.ClientSessionCache implementation by @marten-seemann in #4619
- wire: speed up parsing of headers with arbitrary length connection IDs by @marten-seemann in #4618
- remove trivial mock implementation of the cryptoStream interface by @marten-seemann in #4620
- simplify frame queuing logic for 0-RTT rejection by @marten-seemann in #4607
- handshake: generate CRYPTO_ERRORs for internal_error TLS alerts by @marten-seemann in #4601
- remove unneeded cryptoStream interface by @marten-seemann in #4617
- logging: rename VersionNumber to Version by @marten-seemann in #4621
- implement qlog JSON-SEQ format, bump qlog version by @marten-seemann in #4609
- queue stream-related control frames in the respective stream by @marten-seemann in #4610
- http3: implement server idle timeout support by @rs in #4587
- only declare send stream completed when RESET_STREAM is acknowledged by @marten-seemann in #4613
- fix logging of short header connection IDs by @marten-seemann in #4626
Full Changelog: v0.45.0...v0.46.0
v0.45.2
v0.45.1
This patch release contains two fixes:
- The new Prometheus metrics DefaultConnectionTracer was implemented incorrectly, leading to incorrect metrics being collected: #4560
- The http3.RoundTripper was caching the dial error (#4561). Instead, we should re-dial the QUIC connection: #4573
Full Changelog: v0.45.0...v0.45.1
v0.45.0
New Features
Prometheus
quic-go now exports a few Prometheus metrics, allowing users to get an aggregate picture of what's going on inside their QUIC stack. Currently, only a basic set of metrics is exposed, but we plan to track more metrics in the future (#4554). Head to the documentation to learn how to enable metrics collection.
Prometheus metrics can be used (among others) to build Grafana dashboards, and we provide a sample Grafana dashboard in metrics/dashboard.
Tracing Handshake Progression using a custom context.Context
Users can now set and modify the context that's used on all callbacks called during the handshake, and returned from Connection.Context
(#4507 and #4536). This allows identifying the connection as it progresses through the different handshake stages. The documentation has more details and code samples.
Better Path MTU Discovery
Path MTU Discovery is used to automatically determine the available MTU of the path, which allows us to send full-size packets. This is especially relevant for high-bandwidth transfers.
Our old PMTUD algorithm was susceptible to packet loss, leading to suboptimal results if an MTU probe packet experienced packet loss in the network. The new algorithm (#4545) is now resilient to the consecutive loss of up to two probe packets.
Breaking Changes
Connection.NextConnection
now takes a context and correctly handles handshake failures (#4551)- qlog:
DefaultTracer
was renamed toDefaultConnectionTracer
(#4556) - The
ConnectionTracingKey
is now deprecated. UseTransport.ConnContext
to set your own tracing key (#4532)
Fixes
- The server now correctly restores its QUIC transport parameters when resuming 0-RTT using a
tls.Config
that setsGetConfigForClient
: (#4550)
Changelog
- introduce Transport.ConnContext, use client's context on the connection by @marten-seemann in #4507
- deprecate the ConnectionTracingKey by @marten-seemann in #4532
- http3: fix flaky Extended CONNECT unit test by @marten-seemann in #4537
- remove unneeded stream context cancellation on shutdown by @marten-seemann in #4535
- ci: set timeout for jobs by @marten-seemann in #4538
- http3: fix another flaky Extended CONNECT test by @marten-seemann in #4539
- remove unused SetMax method of the mtuDiscoverer by @marten-seemann in #4543
- http3: use the connection, not the stream context, on the server side by @marten-seemann in #4510
- use a chan instead of a context to track handshake completion by @marten-seemann in #4547
- remove unused function parameter from qtls.SetupConfigForServer by @marten-seemann in #4549
- fix the server's 0-RTT rejection logic when using GetConfigForClient by @marten-seemann in #4550
- add some Prometheus metrics by @marten-seemann in #4534
- make Path MTU Discovery resilient to random packet loss by @marten-seemann in #4545
- add context to EarlyConnection.NextConnection, handle handshake failures by @marten-seemann in #4551
- pass a context to Transport.ConnContext by @marten-seemann in #4536
- metrics: simplify constructor for the default connection tracer by @marten-seemann in #4555
- qlog: rename DefaultTracer to DefaultConnectionTracer by @marten-seemann in #4556
- fix incorrect documentation for Config.DisablePathMTUDiscovery by @marten-seemann in #4558
- metrics: add an example Grafana dashboard by @marten-seemann in #4559
Full Changelog: v0.44.0...v0.45.0
v0.44.0
v0.44 contains a lot of fixes related to HTTP Datagrams, new logic to determine (and configure) the QUIC packet size, as well as a significant speedup of the various parsers.
HTTP Datagram-related Fixes
The last release introduced support for HTTP Datagrams (RFC 9297). This release resolves a number of problems we discovered in the initial implementation:
- reject sending of DATAGRAM frames that exceed the currently available MTU (#4497)
- http3: deadline errors are now ignored in stream state tracking (#4495)
- http3: refuse to send HTTP datagrams associated with a closed stream (#4488)
- http3: use the send stream context for tracking the stream state (#4489)
- http3: fix memory leak caused by stream state tracking (#4523). Thanks to @GeorgeMac for debugging and fixing!
QUIC Packet Size and Path MTU Discovery
- The initial packet size is now configurable via
quic.Config
. Most users should not use this config option, but instead rely on Path MTU discovery (#4503) - The client's initial packet size was increased to 1280 bytes (#4500)
- Respect the client's
max_udp_payload_size
transport parameter (#4514) - qlog: add support for the
mtu_updated
event (#4517)
Speeding up Parsing the variable-length Integers
The QUIC varint parser was rewritten to act on byte slices instead of a bytes.Reader
. This is significantly faster (#4475). The new parser is now used for parsing QUIC frames (#4484), the QUIC packet header (#4481), the QUIC transport parameters (#4483) and HTTP datagrams (#4478).
Other Notable Changes
- http3:
ParseCapsule
now returns anio.EOF
(and not anio.UnexpectedEOF
) if the underlying reader returns anio.EOF
on the first byte (#4476) - http3:
ListenAndServe
was renamed toListenAndServeTLS
(#4522). Thanks to @ETZhangSX! - http3: reserved frame types now cause a connection error, as required by the RFC (#4467)
- http3: pass the correct
Connection
to theConnContext
callback (#4480). Thanks to @rthellend!
quic-go needs your support!
Is your project / company relying on quic-go?
Please consider funding the project. Any support is highly appreciated!
What's Changed
- build(deps): bump golangci/golangci-lint-action from 4 to 5 by @dependabot in #4472
- http3: return an io.EOF when parsing a capsule fails on the first byte by @marten-seemann in #4476
- quicvarint: add a function to parse a varint from a byte slice by @marten-seemann in #4475
- http3: avoid allocation when parsing the datagram's quarter stream ID by @marten-seemann in #4478
- http3: Pass original Conn to ConnContext by @rthellend in #4480
- http3: reject reserved frame types by @marten-seemann in #4467
- fix capture of loop variable in connection probe packet tests by @marten-seemann in #4486
- http3: refuse to send datagrams associated with a closed stream by @marten-seemann in #4488
- http3: use the stream context to detect when the send side is closed by @marten-seemann in #4489
- wire: use quicvarint.Parse to when parsing transport parameters by @marten-seemann in #4482
- wire: use quicvarint.Parse when parsing frames by @marten-seemann in #4484
- wire: refactor header parsing to use quicvarint.Parse by @marten-seemann in #4481
- wire: reduce allocations when parsing transport parameters by @marten-seemann in #4483
- fix incorrect reuse of UDP connection in handshake benchmark by @marten-seemann in #4491
- http3: fix race condition when creating state tracking stream by @marten-seemann in #4493
- ci: run benchmarks by @marten-seemann in #4492
- http3: ignore deadline errors when tracking QUIC stream states by @marten-seemann in #4495
- ci: update golangci-lint-action to v6 and golangci-lint to v1.58.0 by @marten-seemann in #4494
- ci: disable exhaustive linter for test files by @marten-seemann in #4499
- add an integration test for DPLPMTUD by @marten-seemann in #4498
- reject sending of DATAGRAM frames that exceed the current MTU by @marten-seemann in #4497
- wire: write configured value of max_udp_payload_size transport parameter by @marten-seemann in #4501
- increase initial packet size to 1280 bytes (for both IPv4 and IPv6) by @marten-seemann in #4500
- make the initial packet size configurable by @marten-seemann in #4503
- update all golang.org/x dependencies by @marten-seemann in #4506
- initialize the MTU discoverer when processing the transport parameters by @marten-seemann in #4514
- retry the MTU integration test up to 3 times by @marten-seemann in #4519
- logging / qlog: add support for DPLPMTUD by @marten-seemann in #4517
- http3: rename ListenAndServe to ListenAndServeTLS by @ETZhangSX in #4522
- fix(http3): handle streamStateSendAndReceiveClosed in onStreamStateChange by @GeorgeMac in #4523
New Contributors
- @ETZhangSX made their first contribution in #4522
Full Changelog: v0.43.0...v0.44.0
v0.43.1
This is a patch release that fixes a regression when calling http3.Server.ConnContext
introduced in v0.43.0.
Changelog
Full Changelog: v0.43.0...v0.43.1
v0.43.0
quic-go.net: Launching a new Documentation Site
With this release, we're launching a new documentation site for the quic-go projects (quic-go itself, HTTP/3, webtransport-go, and soon, masque-go): quic-go.net.
The documentation site aims to explain QUIC concepts and how they are made accessible using quic-go's API. This site replaces the wiki, and the ever-growing README files.
A lot of work has gone into the documentation already, but we're by no means done yet. The entire source is public in https://github.com/quic-go/docs/, and we're happy about community contributions.
HTTP Datagrams (RFC 9297)
This release adds support for HTTP Datagrams (RFC 9297), both on the client and on the server side (#4452). HTTP Datagrams are used in WebTransport in CONNECT-UDP (RFC 9298), among others.
The new API for HTTP Datagrams is described on the new documentation page: HTTP Datagrams. The integration of HTTP Datagram support necessitated a comprehensive refactor of the HTTP/3 package, resulting in several breaking API changes listed below.
Breaking Changes
- quicvarint: functions now return an
int
instead the internalprotocol.ByteCount
(#4365) - http3:
Server.SetQuicHeaders
was renamed toSetQUICHeaders
(#4377) - http3:
Server.QuicConfig
was renamed toQUICConfig
(#4384) - http3:
RoundTripper.QuicConfig
was renamed toQUICConfig
(#4385) - http3:
RoundTripOpt.CheckSettings
was removed (#4416). Use the newSingleDestinationRoundTripper
API instead. - http3: the
HTTPStreamer
interface is now implemented by thehttp.ResponseWriter
(and not thehttp.Request.Body
) (#4469) - include the maximum payload size in the
DatagramTooLargeError
(#4470)
Other Notable Changes
- GSO and ECN is disabled on kernel versions older than 5 (#4456)
- http3: logging can be controlled using an
slog.Logger
(#4449) - http3: HEAD requests can now be sent in 0-RTT (#4378)
- http3: duplicate QPACK encoder and decoder streams are not rejected as required by the RFC (#4388)
- http3: Extended CONNECT are blocked until the server's SETTINGS are received, as required by the RFC (#4450)
- http3: HTTP/3 client connections aren't removed if
RoundTrip
errors due to a cancelled context (#4448). Thanks to @GeorgeMac! - http3: sniff Content-Type when flushing the ResponseWriter (#4412). Thanks to @WeidiDeng!
- The
Context
exposed on thequic.Stream
is now derived from the connection's context (#4414) - The UDP send and receive buffer size was increased to 7 MiB (#4455). Thanks to @bt90!
Clarifications on the QUIC Stream State Machine
Calling CancelWrite after Close
After a long and fruitful discussion (#4404), we decided to clarify that calling CancelWrite
after Close
on a SendStream
(or a bidirectional stream) should cause a state transition from the "Data Sent" to the "Reset Sent" state, as described in section 3.1 of RFC 9000. This matches the current behavior of quic-go, however, it didn't match the API documentation (fixed in #4419).
This means that stream data will not be delivered reliably if CancelWrite
is called, and that this applies even if Close
was called before.
Garbage Collection of Streams
This release also changes the way streams are garbage-collected (and the peer is granted additional limit to open a new stream), once they're not needed anymore, in a subtle way:
Thanks to @sukunrt for extremely thorough and helpful reviews on both these PRs!
quic-go needs your support!
Is your project / company relying on quic-go?
Please consider funding the project. Any support is highly appreciated!
Changelog
- quicvarint: use int instead of internal protocol.ByteCount type by @marten-seemann in #4356
- http3: improve documentation for Server.SetQuicHeaders by @marten-seemann in #4376
- http3: make it possible to send HEAD requests in 0-RTT by @marten-seemann in #4378
- http3: don't modify any fields of the http.Request when doing 0-RTT by @marten-seemann in #4379
- http3: rename Server.SetQuicHeaders to Server.SetQUICHeaders by @marten-seemann in #4377
- add an integration test for 0-RTT GET requests by @marten-seemann in #4386
- http3: rename Server.QuicConfig to Server.QUICConfig by @marten-seemann in #4384
- http3: rename RoundTripper.QuicConfig to RoundTripper.QUICConfig by @marten-seemann in #4385
- http3: refactor the client's and server's unidirectional stream handling by @marten-seemann in #4387
- http3: reject duplicate QPACK decoder and encoder streams by @marten-seemann in #4388
- http3: introduce a way for the server to query the client's SETTINGS by @marten-seemann in #4389
- don't set the Allow0RTT flag for the client in the HTTP integration test by @marten-seemann in #4397
- http3: reference the correct RFCs in doc comments by @marten-seemann in #4399
- introduce a ConnectionTracingID type for the ConnectionTracingKey by @marten-seemann in #4400
- http3: pass tracing ID instead of quic.Connection to stream hijackers by @marten-seemann in #4401
- expose the connection tracing ID on the stream context by @marten-seemann in #4414
- http3: expose an OpenStream method on the RoundTripper by @marten-seemann in #4409
- http3: cancel reading on request stream if request processing fails by @marten-seemann in #4417
- http3: remove Settingser, StreamCreator, return Connection from Hijacker by @marten-seemann in #4425
- http3: expose a SingleDestinationRoundTripper by @marten-seemann in #4424
- http3: hide SendDatagram and ReceiveDatagram on the Connection by @marten-seemann in #4427
- fix documentation for CancelWrite after Close on the send stream by @marten-seemann in #4419
- http3: simplify buffering of small responses by @marten-seemann in #4432
- http3: simplify composition of the HTTP stream and request stream by @marten-seemann in #4433
- http3: remove Accept(Uni)Stream methods from the Connection interface by @marten-seemann in #4435
- http3: simplify tracking of content length by @marten-seemann in #4438
- http3: move length limiting to the body by @marten-seemann in #4439
- http3: fix flaky RoundTripper test by @marten-seemann in #4442
- http3: simplify response header writing by @marten-seemann in #4441
- http3: reuse clients on RoundTripOpt context canceled by @GeorgeMac in #4448
- http3: use a log/slog Logger for logging by @marten-seemann in #4449
- http3: remove RoundTripOpt.CheckSettings by @marten-seemann in #4416
- catch spurious UDP sendmsg errors in multiplex integration test by @marten-seemann in #4451
- http3: check server SETTINGS before sending an Extended CONNECT request by @marten-seemann in #4450
- http3: process 1xx status codes by @mchtech in #4437
- fix flaky server accept queue test by @marten-seemann in #4453
- http3: fix race condition when closing the RoundTripper by @marten-seemann in #4458
- Increase send/receive buffers to 7MiB by @bt90 in #4455
- testutils: add a token parameter to ComposeInitialPacket by @marten-seemann in #4391
- flowcontrol: make it possible to call Abandon multiple times by @marten-seemann in #4459
- disable GSO and ECN on kernels older than version 5 by @marten-seemann in #4456
- delay completion of the send stream until the reset error was delivered by @marten-seemann in #4445
- delay completion of the receive stream until the reset error was read by @marten-seemann in #4460
- http3: fix race condition in client unit test by @marten-seemann in #4463
- http3: add support for HTTP Datagrams (RFC 9297) by @marten-seemann in #4452
- README: link to the new documentation site by @marten-seemann in #4464
- http3: rename Settings.EnableDatagram to EnableDatagrams by @marten-seemann in #4466
- http3: implement on the HTTPStreamer on the Respon...