From f845e13c4e15a175b7bb2ca489a389d3e3c8b07c Mon Sep 17 00:00:00 2001 From: Jeremie Bolduc <16137441+Jouramie@users.noreply.github.com> Date: Thu, 13 Aug 2026 14:36:30 -0400 Subject: [PATCH] Fix resource leaking on error in AsyncCachingExec --- .../hc/client5/http/impl/cache/AsyncCachingExec.java | 7 ++++++- .../http/async/methods/InflatingZstdDataConsumer.java | 4 +++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/AsyncCachingExec.java b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/AsyncCachingExec.java index 6398155be0..82db5e5c63 100644 --- a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/AsyncCachingExec.java +++ b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/AsyncCachingExec.java @@ -126,8 +126,9 @@ private void triggerResponse( final SimpleBody body = cacheResponse.getBody(); final byte[] content = body != null ? body.getBodyBytes() : null; final ContentType contentType = body != null ? body.getContentType() : null; + AsyncDataConsumer dataConsumer = null; try { - final AsyncDataConsumer dataConsumer = asyncExecCallback.handleResponse( + dataConsumer = asyncExecCallback.handleResponse( cacheResponse, content != null ? new BasicEntityDetails(content.length, contentType) : null); if (dataConsumer != null) { @@ -139,6 +140,10 @@ private void triggerResponse( asyncExecCallback.completed(); } catch (final HttpException | IOException ex) { asyncExecCallback.failed(ex); + } finally { + if (dataConsumer != null) { + dataConsumer.releaseResources(); + } } } diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/async/methods/InflatingZstdDataConsumer.java b/httpclient5/src/main/java/org/apache/hc/client5/http/async/methods/InflatingZstdDataConsumer.java index 3e633bfe96..da924a52cd 100644 --- a/httpclient5/src/main/java/org/apache/hc/client5/http/async/methods/InflatingZstdDataConsumer.java +++ b/httpclient5/src/main/java/org/apache/hc/client5/http/async/methods/InflatingZstdDataConsumer.java @@ -130,7 +130,9 @@ public void streamEnd(final List trailers) throws HttpExceptio @Override public void releaseResources() { - dctx.close(); + if (closed.compareAndSet(false, true)) { + dctx.close(); + } downstream.releaseResources(); } } \ No newline at end of file