From 9156cdef27e1747ba8062821f3deb9457f604fc3 Mon Sep 17 00:00:00 2001 From: Steve Hawkins Date: Tue, 18 Oct 2022 10:57:29 -0400 Subject: [PATCH] fix #4201: jetty's bytebuffers may be immediately re-used --- .../client/jetty/JettyAsyncResponseListener.java | 10 +++++++++- .../io/fabric8/kubernetes/client/http/HttpClient.java | 2 ++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/httpclient-jetty/src/main/java/io/fabric8/kubernetes/client/jetty/JettyAsyncResponseListener.java b/httpclient-jetty/src/main/java/io/fabric8/kubernetes/client/jetty/JettyAsyncResponseListener.java index 2ee8ad50c0..ba09dc235e 100644 --- a/httpclient-jetty/src/main/java/io/fabric8/kubernetes/client/jetty/JettyAsyncResponseListener.java +++ b/httpclient-jetty/src/main/java/io/fabric8/kubernetes/client/jetty/JettyAsyncResponseListener.java @@ -94,7 +94,8 @@ public void onContent(Response response, LongConsumer demand, ByteBuffer content this.demand.complete(demand); } try { - bodyConsumer.consume(process(response, content), this); + // we must clone as the buffer can be reused after the call to succeeded + bodyConsumer.consume(process(response, clone(content)), this); callback.succeeded(); } catch (Exception e) { callback.failed(e); @@ -102,4 +103,11 @@ public void onContent(Response response, LongConsumer demand, ByteBuffer content } protected abstract T process(Response response, ByteBuffer content); + + public static ByteBuffer clone(ByteBuffer original) { + ByteBuffer clone = ByteBuffer.allocate(original.remaining()); + clone.put(original); + clone.flip(); + return clone; + } } diff --git a/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/http/HttpClient.java b/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/http/HttpClient.java index e59a40d947..b540f07cf9 100644 --- a/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/http/HttpClient.java +++ b/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/http/HttpClient.java @@ -199,6 +199,8 @@ default CompletableFuture> sendAsync(HttpRequest request, Cl /** * Send a request and consume the bytes of the resulting response body + *

+ * HtttpClient implementations will provide ByteBuffers that may be held directly. * * @param request the HttpRequest to send * @param consumer the response body consumer