[fix][sec][branch-4.x] Upgrade async-http-client to 2.16.1 - #26436
Merged
Technoboy- merged 1 commit intoAug 31, 2026
Conversation
Upgrades org.asynchttpclient:async-http-client from 2.15.0 to 2.16.1. 2.16.0 fixes GHSA-m452-q8c9-rg2f (Set-Cookie domain not validated against the request host). 2.16.1 fixes 14 further advisories, covering proxy and CONNECT credential leaks, WebSocket handshake and proxy credential handling, Digest authentication weaknesses, cookie public-suffix validation, connection pool key scoping and unbounded HTTP/1.1 response decompression. The transitive dependency set is unchanged: reactive-streams stays at 1.0.4 and netty-reactive-streams at 2.0.6, and Pulsar continues to pin Netty at 4.1.137.Final, above the 4.1.136.Final that async-http-client 2.16.1 declares.
lhotari
requested review from
Technoboy-,
dao-jun,
david-streamlio,
merlimat and
nodece
August 31, 2026 08:25
Technoboy-
approved these changes
Aug 31, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Motivation
org.asynchttpclient:async-http-clienton branch-4.2 is at 2.15.0. Two releases have shipped since, both entirely security fixes.2.16.0 fixes GHSA-m452-q8c9-rg2f — a
Set-CookieDomainattribute was not validated against the request host.2.16.1 fixes 14 further advisories:
Domainattribute is not checked against the public suffix listSec-WebSocket-AcceptcheckModifications
Bump
asynchttpclient.versionfrom 2.15.0 to 2.16.1 and update the matching jar names in the server and shell binaryLICENSE.bin.txtfiles. No other module hard-codes the version; the property is the single source of truth.The transitive dependency set is unchanged —
reactive-streamsstays at 1.0.4 andnetty-reactive-streamsat 2.0.6 — so no LICENSE entries are added or removed. async-http-client 2.16.1 declares Netty 4.1.136.Final, below Pulsar's pinned 4.1.137.Final, and Pulsar excludesio.netty:*andcom.typesafe.netty:netty-reactive-streamsfrom the async-http-client dependency in any case.Behaviour changes upstream documents, and why they do not reach Pulsar
async-http-client documents four behaviour changes in 2.16.1. Three are unreachable from Pulsar:
Domainnames a public suffix is refused — unreachable. Every productionAsyncHttpClientconstruction site callssetCookieStore(null), so no cookie is ever stored or sent.ResponseFilterreplaying onto a different host no longer carries the first origin's realm (and the related cross-origin-redirect advisory) — unreachable. Pulsar constructs no async-http-clientRealmanywhere; admin authentication is attached as plain HTTP headers.AsyncHttpConnectoralso disables the library's own redirect follower (setFollowRedirect(false)) and implements redirects itself, and that code is untouched by the bump.The remaining change does reach Pulsar and is worth calling out: the decompression-bomb fix adds a cumulative 256 MiB ceiling on the inflated size of a single response body.
PulsarAdmindefaultsacceptGzipCompressiontotrueand the broker gzips its responses, so this ceiling now applies to admin responses. 256 MiB of decompressed JSON is far outside any realistic admin response, and the limit is configurable via theorg.asynchttpclient.maxDecompressedResponseSizeproperty, so this is not expected to be observable. Package, function, sink and source downloads do not set the gzip header and are not subject to it.Verifying this change
This change is a dependency upgrade without new test coverage. It was verified locally as follows:
mvn -Pcore-modules,-main install— BUILD SUCCESS.pulsar-client-admin,pulsar-client-tools,pulsar-broker-auth-oidc) — BUILD SUCCESS, confirming real recompilation rather than an incremental no-op.mvn dependency:treeconfirmsasync-http-client:2.16.1andasync-http-client-netty-utils:2.16.1resolve, withreactive-streams:1.0.4andnetty-reactive-streams:2.0.6unchanged.src/check-binary-license.shpasses on both the rebuilt server and shell binary tarballs.public_suffix_list.dat) that is loaded by an absolute path from a static initializer. The shade plugin relocates the resource entry and rewrites the path string constant in lockstep — both land onorg/apache/pulsar/shade/org/asynchttpclient/cookie/public_suffix_list.dat— so there is no fail-open in the shaded artifacts.Does this pull request potentially affect one of the following parts:
If the box was checked, please highlight the changes