Skip to content

Releases: quic-go/quic-go

v0.61.0

Choose a tag to compare

@marten-seemann marten-seemann released this 24 Jul 16:39
Immutable release. Only release title and notes can be modified.
579ee19

This release adds new stream APIs intended for application protocols that perform their own flow-control accounting, such as WebTransport:

  • SendStream and Stream now expose TryWriteAll, which queues an entire buffer without blocking or returns ErrWouldBlock without queueing anything: #5704
  • SendStream and Stream now expose WriteWithLimit, allowing higher-level protocols to apply an additional send limit while data is packetized: #5753
  • ReceiveStream and Stream now expose SetReceiveFinalSizeCallback, which reports the final receive-side stream size once it is learned from a FIN or RESET_STREAM frame: #5752

Support for the RESET_STREAM_AT extension was updated to draft-09, while retaining support for the draft-07 codepoint for backwards compatibility: #5724

Breaking Changes

  • http3: ParseCapsule was replaced by the stateful CapsuleParser and CapsuleReader APIs. Each capsule payload must now be consumed or discarded before advancing to the next capsule: #5729
  • The StreamID.Type and StreamID.InitiatedBy methods were removed because they exposed internal types: #5744
  • qlog: datagram IDs were replaced by CRC32c payload checksums. The JSON field is now datagram_payload_checksum instead of datagram_id, and the corresponding exported qlog types were renamed: #5758

Notable Fixes

  • Transport parameter parsing is around 27% faster and now reliably rejects duplicate transport parameters: #5712
  • Session tickets containing unknown transport parameters are now rejected during restoration, preventing 0-RTT resumption when an endpoint no longer understands an extension recorded in the ticket: #5714
  • RESET_STREAM_AT negotiation is now applied correctly to streams opened before transport parameters are received during 0-RTT: #5715
  • RESET_STREAM_AT support is now cleared after 0-RTT rejection, preventing new streams from inheriting the rejected connection's setting: #5716
  • Pending stream control frames from a rejected 0-RTT attempt are now discarded instead of being sent after rejection: #5717
  • Remembered RESET_STREAM_AT support is now validated across 0-RTT resumption: #5722
  • http3: receiving a GOAWAY now unblocks pending OpenStreamSync calls and prevents new request streams from being opened: #5730
  • http3: invalid header values are no longer included in validation errors, avoiding accidental exposure of sensitive values when errors are logged: #5742

Changelog

Full Changelog: v0.60.0...v0.61.0

v0.60.0

Choose a tag to compare

@marten-seemann marten-seemann released this 06 Jun 08:07
Immutable release. Only release title and notes can be modified.
7612ad1

Starting with v0.60.0, quic-go is ready for use in FIPS 140-3 environments when built with Go 1.26 or newer and used with the Go Cryptographic Module. See FIPS140.md for details.

This required a number of changes:

  • switch QUIC HKDF usage to the standard library crypto/hkdf: #5461
  • use the Go standard library's TLS 1.3 AES-GCM implementation for QUIC packet protection AEADs: #5624
  • use cipher.NewGCMWithRandomNonce for address validation token encryption: #5625
  • disable FIPS 140-3 enforcement for the Retry packet integrity tag, which is outside the FIPS 140-3 scope: #5630
  • disable FIPS 140-3 enforcement for Initial packet protection, whose secrets are derived from public RFC constants: #5640
  • guard the internal ChaCha20-Poly1305 code path so it is not used in FIPS 140-3 mode: #5633
  • add FIPS / non-FIPS data transfer integration tests, including Retry and key updates: #5646

Breaking Changes

  • quic-go now requires Go 1.25 or newer: #5561

Notable Fixes

  • path probe packets now correctly pass the OOB data (needed to select the correct network interface in some system configurations): #5544, thanks to @on-keyday
  • cancel the Stream and SendStream context when the connection is closed: #5556, thanks to @zvdy
  • http3: validate Extended CONNECT ``:protocol` pseudo-header values according to HTTP token syntax: #5639
  • http3: always set http.Request.Scheme and http.Request.Host: #5554, thanks to @qiulaidongfeng
  • http3: fixed a nil pointer dereference when Server.Logger is unset: #5671
  • fix maximum datagram size estimation after MTU discovery: #5650, thanks to @jinq0123
  • OpenStreamSync now reliably returns the context error when the context is cancelled: #5660

Behind the scenes

In the last couple of months, we have reworked our fuzz setup and the integration into OSS-Fuzz: First of all, all fuzzers were rewritten to Go native fuzzing (#5592, #5599, #5600, #5603, #5613). We also added new fuzzers for the HTTP/3 frame parser (#5595), HTTP/3 request, response and trailer decoding (#5602) and the STREAM / CRYPTO frame sorter (#5620).

Since native Go fuzzing uses a different seed corpus format, we now use the newly implemented go-ossfuzz-seeds library to generate OSS-Fuzz compatible seed corpus files from f.Add calls.

We also enable ClusterFuzzLite batch fuzzing (#5605), including. a seed corpus (#5607). Fuzz coverage for both ClusterFuzzLite batch fuzzing (#5641) and for OSS-Fuzz fuzzing (#5655) is now submitted to Codecov.

Changelog

Read more

v0.59.1

Choose a tag to compare

@marten-seemann marten-seemann released this 11 May 03:39
Immutable release. Only release title and notes can be modified.
438abf0

This patch release backports #5642, which adds validation for HTTP/3 trailers.

v0.59.0

Choose a tag to compare

@marten-seemann marten-seemann released this 11 Jan 11:12
Immutable release. Only release title and notes can be modified.
7659dd8

This release adds a couple of new features:

  • Adds an API to peek stream data on ReceiveStream and Stream: #5501
  • Adds an API to peek the next varint on a stream: #5502
  • Reworks the API exposed by the HTTP/3 package for WebTransport: #5509, #5512. Regular HTTP/3 use cases should not be affected by these changes.
  • Adds support for HTTP request trailers (trailers sent by the client): #5507

Breaking Changes

  • Removes the deprecated ClientHelloInfo: #5497
  • Removes the deprecated ConnectionTracingID and ConnectionTracingKey: #5521
  • http3: the qlogger is now closed after all streams have been handled: #5524
  • The ConnectionState now reports both the local and the remote status of the QUIC Datagram and Reliable Stream Reset extensions: #5533

Other Notable Fixes

  • Fixes an infinite loop of PING-only packets caused by a bug in the PTO queueing logic: #5538 and #5539
  • http3: Fixes a race condition between new request streams and GOAWAY: #5522
  • qlog: Fixes a race condition between RecordEvent and Close: #5523

Changelog

Full Changelog: v0.58.0...v0.59.0

v0.58.1

Choose a tag to compare

@marten-seemann marten-seemann released this 11 Jan 09:54
Immutable release. Only release title and notes can be modified.
e5ae49f

This patch release backports fixes for a bug in the PTO queueing logic that could lead to an infinite loop of PING packets.

Bug Fixes

  • ackhandler: fix qlogging of outstanding packet count (#5538)
  • ackhandler: fix counting of packets queued for PTO probing (#5539)

v0.58.0

Choose a tag to compare

@marten-seemann marten-seemann released this 21 Dec 08:14
Immutable release. Only release title and notes can be modified.
96b8144

This release optimizes the QUIC handshake:

  • Multiple incoming packets are now processed before sending an acknowledgment, reducing the total number of packets sent: #5451
  • ACK frames are now packed into coalesced packets, reducing the need to send a separate packet just for the ACK in many cases: #5477
  • When packets are buffered during the handshake, this now doesn't lead to inflated RTT measurements anymore: #5493, #5494

Other notable changes

  • quic-go now has a new logo: #5484
  • ACK frames can now be encoded with up to 64 ranges (previously: 32): #5476
  • Serializing ACK frames is now significantly faster: #5476
  • Improved batch packet processing logic: #5478
  • qlog: added support for the datagram_id on packet_sent, packet_received and packet_buffered events, using the CRC32 of the packet: #5455

Changelog

Full Changelog: v0.57.0...v0.58.0

v0.57.1

Choose a tag to compare

@marten-seemann marten-seemann released this 26 Nov 05:45
Immutable release. Only release title and notes can be modified.
4b0ab7e

This release resolves a panic during the server handshake when using the upcoming Go 1.26 toolchain, specifically occurring with TLS session tickets disabled (#5462). This issue does not impact builds on Go 1.25 or earlier versions.

v0.57.0

Choose a tag to compare

@marten-seemann marten-seemann released this 21 Nov 10:56
Immutable release. Only release title and notes can be modified.
5b2d212

This release contains a fix for CVE-2025-64702 by reworking the HTTP/3 header processing logic:

  • Both client and server now send their respective header size constraints using the SETTINGS_MAX_FIELD_SECTION_SIZE setting: #5431
  • For any QPACK-related errors, the correct error code (QPACK_DECOMPRESSION_FAILED) is now used: #5439
  • QPACK header parsing is now incremental (instead of parsing all headers at once), which is ~5-10% faster and reduces allocations: #5435 (and quic-go/qpack#67)
  • The server now sends a 431 status code (Request Header Fields Too Large) when encountering HTTP header fields exceeding the size constraint: #5452

 

Breaking Changes

  • http3: Transport.MaxResponseBytes is now an int (before: int64): #5433
     

Notable Fixes

  • qlogwriter: fix storing of event schemas (this prevented qlog event logging from working for HTTP/3): #5430
  • http3: errors sending the request are now ignored, instead, the response from the server is read (thereby allowing the client to read the status code, for example): #5432

What's Changed

New Contributors

Full Changelog: v0.56.0...v0.57.0

v0.56.0

Choose a tag to compare

@marten-seemann marten-seemann released this 08 Nov 05:03
Immutable release. Only release title and notes can be modified.
eb7fcf5

This release introduces qlog support for HTTP/3 (#5367, #5372, #5374, #5375, #5376, #5381, #5383).

For this, we completely changed how connection tracing works. Instead of a general-purpose logging.ConnectionTracer (which we removed entirely), we now have a qlog-specific tracer (#5356, #5417). quic-go users can now implement their own qlog events.

It also removes the Prometheus-based metrics collection. Please comment on the tracking issue (#5294) if you rely on metrics and are interested in seeing metrics brought back in a future release.

Notable Changes

  • replaced the unmaintained gojay with a custom, performance-optimized JSON encoder (#5353, #5371)
  • quicvarint: improved panic message for numbers larger than 2^62 (#5410)

Behind the Scenes

Go 1.25 introduced support for testing concurrent code using testing/synctest. We've been working on transitioning tests to use synctest (#5357, #5391, #5393, #5397, #5398, #5403, #5414, #5415), using @MarcoPolo's simnet package to simulate a network in memory.

Using synctest makes test execution more reliable (reducing flakiness). The use of a synthetic clock leads to a massive speedup; the execution time of some integration tests was reduced from 20s to less than 1ms. The work will continue for the next release (see tracking issue: #5386).

Changelog

New Contributors

  • @kriztalz made their first contribution in #5377
  • @Copilot made their first contribution in #5382

Full Changelog: v0.55.0...v0.56.0

v0.55.0

Choose a tag to compare

@marten-seemann marten-seemann released this 03 Oct 08:25
Immutable release. Only release title and notes can be modified.
7c1ce0e

This release contains a number of improvements and fixes, and it updates the supported Go versions to 1.24 and 1.25.

Optimizations

When sending packets on a QUIC connection, RFC 9002 requires us to save the timestamp for every packet sent. In #5344, we implemented a memory-optimized drop-in replacement for time.Time, which reduces the memory required from 24 to 8 bytes, and vastly speeds up timer calculations (which happen very frequently).

New Features

  • Basic connection statistics are now exposed via Conn.ConnectionStats, thanks to @MarcoPolo
  • On some links, packet reordering can lead to spurious detections of packet loss when using the loss detection logic specified in RFC 9002. #5355 adds logic detect when packet loss is detected spuriously.

Notable Fixes

  • http3: don't allow usage of closed Transport: #5324, thanks to @Glonee
  • http3: fix race in concurrent Transport.Roundtrip calls: #5323, thanks to @Glonee
  • improve and fix connection timer logic: #5339, thanks to @sukunrt for a very comprehensive code review

Behind the Scenes

We have started transitioning tests to make use of the new synctest package that was added in Go 1.25 (and was available as a GOEXPERIMENT in Go 1.24): #5291, #5296, #5298, #5299, #5302, #5304, #5305, #5306, #5317. This is a lot of work, but it makes the test execution both faster and more reliable.

Changelog

New Contributors

Full Changelog: v0.54.0...v0.55.0