Skip to content

Commit e395e13

Browse files
committed
Update the 10.2.1 changelog and release notes
Add CHANGELOG-10.2.1, and describe in what's new and upgrading what 10.2.1 adds to 10.2.0: JA4 fingerprints, compress ETags, session ticket keys, allow_half_open, the 9.2 compat key and hrw4u exit status.
1 parent 9cb900d commit e395e13

3 files changed

Lines changed: 200 additions & 0 deletions

File tree

‎CHANGELOG-10.2.1‎

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
Changes with Apache Traffic Server 10.2.1
2+
#13553 - origin_server_auth: Improve log messages
3+
#13567 - Metrics: Revert added locking and annotations
4+
#13505 - Add hidden metrics and MAX/MIN/incremental derived metric aggregation
5+
#13538 - Fix records_yaml startup lookup race
6+
#13510 - doc: rate_limit uses max_age, not max-age
7+
#13238 - prefetch: move cache key acquisition to CACHE_LOOKUP_COMPLETE
8+
#13580 - compress: add Vary to cached client responses
9+
#13506 - Per upstream server connection metrics via hidden and derived metrics
10+
#13577 - Fix silently dropped Streams.all autest assertions
11+
#13110 - Add `_reload` directive support for config reload framework.
12+
#13589 - Skip rate_limit AuTests when plugin not built
13+
#13593 - Fix Clang 21 analyzer findings
14+
#13576 - Fix client certificate context updates
15+
#13578 - Remove dead JSONRPC server_shutdown handler
16+
#13227 - Fix data race in SSLCertContext copy & assignment
17+
#13642 - Proxy Verifier v3.2.0
18+
#13558 - dns: fix remaining-space tracking when copying address records
19+
#13570 - Argparser variable arg option parsing fix/improvement.
20+
#13583 - Metrics: close the id lookup race and bounds gaps left by the lock revert
21+
#13652 - Restore regex_remap's default PCRE2 match limit
22+
#13646 - header_rewrite: build the matcher for %{LAST-CAPTURE} conditions
23+
#13514 - Share HTTP accept properties
24+
#13645 - Cleanup LogField Registration
25+
#13063 - Add changelog generation tool for GitHub milestones
26+
#13574 - Fix TransformVConnection leak in abort_tunnel()
27+
#13450 - h2origin autest: honor the 30s squid.log wait budget
28+
#13672 - header_rewrite: guard the i == 0 case in HRWSimpleTokenizer
29+
#13673 - Fix build errors with LLVM 23
30+
#13616 - Allow a metric to be unlisted
31+
#13697 - Fix strncasecmp checks that accepted a prefix as equal
32+
#13355 - Add --version CLI flag to hrw4u
33+
#13666 - Retract per server metrics when the mode changes
34+
#13700 - Fix the 9.2 compatibility cache key for paths that carry ";params"
35+
#13696 - hrw4u: admit SESSION_VARS as a denyable section
36+
#13611 - Make the 9.2 compatibility cache key usable end to end
37+
#13571 - Use __atomic builtins as the freelist 128-bit CAS fallback
38+
#13655 - QPACK: use || in the varint decode range guards
39+
#13656 - hrw4u: exit non-zero on compile errors
40+
#13699 - hrw4u: add an AST round-trip test over the whole corpus
41+
#13675 - hrw4u: enforce sandbox NOT and in on their implicit spellings
42+
#13653 - Handle all cachekey regex capture groups
43+
#13715 - Test 103 Early Hints before a cached range response
44+
#13718 - cache: retry without O_DIRECT for an explicit file span
45+
#13560 - Honor allow_half_open when a client aborts early
46+
#13455 - Reuse deleted MIME field slots
47+
#13677 - Fix global TLS ticket key use for certificate contexts
48+
#13717 - tests: cover the global TLSv1.3 session ticket count
49+
#13740 - Coverity: avoid unsigned wrap in AIO cache_op loop
50+
#13728 - Fix SSL 2.0 version code in JA4 fingerprints
51+
#13736 - Bind session ticket keys to the dest_ip certificate
52+
#13719 - Hex-encode non-alphanumeric ALPN bytes in JA4 fingerprints
53+
#13725 - Include signature algorithms in JA4 fingerprints
54+
#13762 - Python 3.15: accommodate PyYAML without CLoader
55+
#13761 - Handle OpenSSL 4 handshake buffer exhaustion
56+
#13760 - Support OpenSSL 4 certificate accessors in WASM
57+
#13695 - Fix HTTP flow control policy reload
58+
#13759 - Remove unused globals rejected by Clang 23
59+
#13766 - Harden shutdown against repeated exit signals
60+
#13782 - Fix parsing of bodyless HTTP/2 origin responses over 4 KB
61+
#13351 - Handle HTTP/2 1xx interim responses from the origin
62+
#13447 - HTTP/2 to origin session pool and reliability fixes
63+
#13776 - compress: use weak ETags for compressed responses
64+
#13783 - Drain an HTTP/2 origin session after it sends GOAWAY
65+
#13723 - tests: drive tls_sni_groups with openssl s_client
66+
#13780 - Deliver H2 END_STREAM that arrives while read is throttled
67+
#13729 - Honor TLS handshake hook pauses on BoringSSL
68+
#13763 - Frame empty TLS origin responses in AuTests
69+
#13674 - hrw4u: enforce sandbox policy on value functions
70+
#13767 - cache: keep the stripe locked after the shutdown dir sync
71+
#13559 - Build the well-known-string table at compile time
72+
#13376 - Reduce repeated work in HTTP header parsing
73+
#13739 - hrw4u: report each sandbox warning at the use that triggers it
74+
Fix use-after-free in wasm plugin TXN_CLOSE epilogue
75+
Compare h2 Content-Length and payload at full width
76+
wasm: Validate metric ID before making API call
77+
http: reject HEAD requests carrying Content-Length/Transfer-Encoding
78+
Throttle @ header strip logs
79+
tsmemcache: bind to loopback by default and add configurable bind address
80+
Regex: optionally require whole-subject matches for policy rules
81+
Strip unauthorized x-amz- request headers in origin_server_auth
82+
CVE-2025-55702 - Fix request with POST Expect: 100-continue
83+
Require a matching client certificate for outbound session reuse
84+
magick: require signing key and allowlist convert operators
85+
origin_server_auth: clarify x-amz- stripping scope in docs and comments
86+
proxy: reject resumed TLS sessions missing a required client cert
87+
Fix mTLS for TLS resumption scenarios
88+
Drop the special case for badly formed 302 responses
89+
doc: correct the regex matching contract where sites enforce full match
90+
Size chunked passthrough writes without dropped trailers
91+
chunked_encoding: add regression test for chunked responses with trailers
92+
Reuse an origin connection only after its request body is written
93+
doc: record the security release in the release notes
94+
Count the Pad Length field in the h2 DATA padding check
95+
Fix a SIGSEGV in UnixNetVConnection::net_write_io on dechunked POST responses

‎doc/release-notes/upgrading.en.rst‎

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,58 @@ Plugins
233233
:file:`sni.yaml` already require a whole-subject match and are unaffected by
234234
the setting (CVE-2026-22068).
235235

236+
Changes in 10.2.1
237+
-----------------
238+
239+
These are the behavior changes in 10.2.1 that are not security hardening. The
240+
security-related ones, including the new ``reject_head_with_content`` default, are
241+
under `Security Hardening`_ and `TLS Session Resumption`_ above.
242+
243+
* JA4 fingerprints change. ``ja4_fingerprint`` and ``jax_fingerprint`` now hash
244+
the client's signature algorithms into the last section of the fingerprint, as
245+
the JA4 specification requires, hex-encode ALPN bytes that are not
246+
alphanumeric, and report the correct version code for SSL 2.0. The last section
247+
of almost every fingerprint differs from 10.2.0, so stored fingerprints, and
248+
any allow or deny rules built from them, must be regenerated.
249+
250+
* ``compress`` sends a weak ``ETag`` (``W/"abc"``) for a compressed response and
251+
adds ``Vary`` to cached client responses. A client holding a compressed copy can
252+
still revalidate with ``If-None-Match``, but ``If-Match`` and ``If-Range``
253+
compare strongly and no longer match it. See :ref:`admin-plugins-compress`.
254+
255+
* TLS session ticket keys follow the global ticket key configuration for every
256+
certificate context, and for a ``dest_ip`` certificate they are derived from
257+
that certificate, so a ticket issued for one certificate is not accepted for
258+
another. Tickets issued by 10.2.0 may not resume after the upgrade and
259+
complete a full handshake. A context whose keys cannot be bound to a
260+
certificate neither issues nor accepts tickets, counted by
261+
:ts:stat:`proxy.process.ssl.total_tickets_no_certificate`.
262+
263+
* With :ts:cv:`proxy.config.http.allow_half_open` set to ``0``, a client that
264+
aborts before the origin has sent its response header again tears down the
265+
origin connection. Since 10.1 it was held open until the response arrived.
266+
267+
* When :ts:cv:`proxy.config.http.cache.try_compat_key_read` is enabled, a
268+
legacy object is revalidated without conditional headers so the full response
269+
is stored under the current key, and invalidations are sent to both keys. Plan
270+
for the extra origin transfer on first revalidation.
271+
272+
* :program:`hrw4u` exits ``1`` when any input fails to compile, where it
273+
previously exited ``0``. Build scripts that ignored the status will now fail.
274+
Its sandbox policy also applies to more spellings than before, so a
275+
configuration that passed with a deny list on 10.2.0 may now be rejected.
276+
277+
* ``ts::Metrics`` no longer has an iterator; see the API note later in this
278+
section.
279+
280+
* New configuration: :ts:cv:`proxy.config.http.per_server.connection.metric_aggregate`
281+
and :ts:cv:`proxy.config.http.per_server.connection.metric_prefix`, alongside
282+
the documented
283+
:ts:cv:`proxy.config.http.per_server.connection.metric_enabled`. With
284+
``metric_enabled`` set and ``metric_aggregate`` at its default of ``0``, behavior
285+
is unchanged; values ``2`` and ``3`` stop publishing the per group metrics for
286+
match type ``both``.
287+
236288
Incompatible Changes
237289
--------------------
238290

‎doc/release-notes/whats-new.en.rst‎

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,59 @@ installation does not have, is:
6666
* ``magick`` requires a signing key and will not load without one, and allowlists
6767
the ImageMagick ``convert`` operators it will run.
6868

69+
Changes in 10.2.1
70+
-----------------
71+
72+
The 10.2.1 maintenance release adds 95 commits from 19 contributors to 10.2.0.
73+
Besides the security fixes above, the changes an operator or plugin author is
74+
likely to notice are below. The sections that follow describe 10.2 as a whole,
75+
including these changes where they touch the same feature. Behavior changes that
76+
need action before upgrading from 10.2.0 are collected under ``Changes in
77+
10.2.1`` in :ref:`upgrading`.
78+
79+
* Per upstream server connection metrics. Setting
80+
:ts:cv:`proxy.config.http.per_server.connection.metric_enabled` publishes
81+
``current_connection``, ``total_connection`` and ``blocked_connection`` for
82+
each upstream server group, and the new
83+
:ts:cv:`proxy.config.http.per_server.connection.metric_aggregate` can instead
84+
publish only per hostname sums and a ``current_connection.max`` gauge, which
85+
keeps the metric count proportional to hostnames rather than to addresses. The
86+
optional :ts:cv:`proxy.config.http.per_server.connection.metric_prefix`
87+
distinguishes metrics of separate ``match`` configurations. See
88+
:ref:`per-server-connection-metrics`.
89+
* The metrics store supports hidden metrics, which are recorded but never
90+
published, and MAX, MIN and incremental derived metrics. See the
91+
``ts::Metrics`` documentation in the developer guide.
92+
* Configuration reload accepts *reload directives*: operational parameters, such
93+
as scoping a reload to one entry, passed to a single handler with
94+
``traffic_ctl config reload -D config_key.directive=value`` or under a
95+
``_reload`` key in the RPC payload. They are delivered to the handler
96+
separately from the configuration content.
97+
* HTTP/2 to the origin is considerably more robust: 1xx interim responses are
98+
handled, header blocks split across ``CONTINUATION`` frames are accepted,
99+
responses to ``HEAD`` and ``304`` are validated correctly, a half-closed or
100+
``GOAWAY``-draining session is no longer reused, one request's
101+
``Connection: close`` no longer poisons a long-lived session, and a request the
102+
origin reports as unprocessed (``GOAWAY`` or ``REFUSED_STREAM``) is retried when
103+
its body can be replayed. New counters
104+
:ts:stat:`proxy.process.http.origin.reuse_fail`,
105+
:ts:stat:`proxy.process.http.origin.retry_admitted` and
106+
:ts:stat:`proxy.process.http.origin.retry_body_unavailable` expose this.
107+
* :ts:cv:`proxy.config.http.cache.try_compat_key_read` is now usable end to end:
108+
revalidating a legacy object stores the full response under the current key and
109+
invalidations are sent to both keys.
110+
* The ``compress`` plugin adds ``Vary`` to cached client responses and sends a
111+
weak ``ETag`` for compressed responses.
112+
* ``ja4_fingerprint`` and ``jax_fingerprint`` now follow the JA4 specification.
113+
* :program:`hrw4u` exits non-zero on compile errors, has a ``--version`` option,
114+
and its sandbox policy covers value functions, string interpolation, implicit
115+
``NOT`` and ``in`` spellings, and the ``SESSION_VARS`` section.
116+
* ``TSStatIdIsValid()`` lets a plugin validate a statistic index received from an
117+
external source before using it.
118+
* A new tool generates the changelog from a GitHub milestone.
119+
* Builds were fixed for LLVM 23 and Clang 21 and 23 diagnostics, OpenSSL 4
120+
handshake buffers and certificate accessors, and Python 3.15.
121+
69122
Configuration Reload
70123
--------------------
71124

0 commit comments

Comments
 (0)