From f74d3c9a4e72fb6a6971c03ffcc0df0c52990173 Mon Sep 17 00:00:00 2001 From: David Schlosnagle Date: Fri, 28 Jul 2023 12:55:38 -0400 Subject: [PATCH] BinaryRequestBody and ContentBody use InputStream.transferToOutputStream Allow for optimization when underlying input stream (such as ByteArrayInputStream, ChannelInputStream) overrides transferTo(OutputStream) to avoid extra array allocations. See * https://bugs.openjdk.org/browse/JDK-8067661 * https://bugs.openjdk.org/browse/JDK-8265891 * https://bugs.openjdk.org/browse/JDK-8273038 * https://bugs.openjdk.org/browse/JDK-8279283 * https://bugs.openjdk.org/browse/JDK-8296431 --- .../dialogue/annotations/InputStreamContentBody.java | 3 +-- .../test/java/com/palantir/verification/IntegrationTest.java | 5 +++-- .../main/java/com/palantir/dialogue/BinaryRequestBody.java | 3 +-- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/dialogue-annotations/src/main/java/com/palantir/dialogue/annotations/InputStreamContentBody.java b/dialogue-annotations/src/main/java/com/palantir/dialogue/annotations/InputStreamContentBody.java index 059acbae8f..e7c7903245 100644 --- a/dialogue-annotations/src/main/java/com/palantir/dialogue/annotations/InputStreamContentBody.java +++ b/dialogue-annotations/src/main/java/com/palantir/dialogue/annotations/InputStreamContentBody.java @@ -16,7 +16,6 @@ package com.palantir.dialogue.annotations; -import com.google.common.io.ByteStreams; import com.palantir.logsafe.Preconditions; import com.palantir.logsafe.UnsafeArg; import com.palantir.logsafe.logger.SafeLogger; @@ -39,7 +38,7 @@ final class InputStreamContentBody implements ContentBody { @Override public void writeTo(OutputStream output) throws IOException { - ByteStreams.copy(inputStream, output); + inputStream.transferTo(output); } @Override diff --git a/dialogue-client-verifier/src/test/java/com/palantir/verification/IntegrationTest.java b/dialogue-client-verifier/src/test/java/com/palantir/verification/IntegrationTest.java index e7e75d2322..192b23d0b1 100644 --- a/dialogue-client-verifier/src/test/java/com/palantir/verification/IntegrationTest.java +++ b/dialogue-client-verifier/src/test/java/com/palantir/verification/IntegrationTest.java @@ -144,8 +144,9 @@ public void stream_3_gigabytes() throws IOException { undertowHandler = exchange -> { exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "application/octet-stream"); - InputStream bigInputStream = repeat(sample, limit); - ByteStreams.copy(bigInputStream, exchange.getOutputStream()); + try (InputStream bigInputStream = repeat(sample, limit)) { + bigInputStream.transferTo(exchange.getOutputStream()); + } }; Stopwatch sw = Stopwatch.createStarted(); diff --git a/dialogue-target/src/main/java/com/palantir/dialogue/BinaryRequestBody.java b/dialogue-target/src/main/java/com/palantir/dialogue/BinaryRequestBody.java index 328086d94b..cbe2a2302f 100644 --- a/dialogue-target/src/main/java/com/palantir/dialogue/BinaryRequestBody.java +++ b/dialogue-target/src/main/java/com/palantir/dialogue/BinaryRequestBody.java @@ -16,7 +16,6 @@ package com.palantir.dialogue; -import com.google.common.io.ByteStreams; import com.palantir.logsafe.Preconditions; import java.io.Closeable; import java.io.IOException; @@ -49,7 +48,7 @@ static BinaryRequestBody of(InputStream inputStream) { public void write(OutputStream requestBody) throws IOException { Preconditions.checkState(!invoked, "Write has already been called"); invoked = true; - ByteStreams.copy(inputStream, requestBody); + inputStream.transferTo(requestBody); } @Override