diff --git a/conjure-java-jaxrs-client/src/main/java/com/palantir/conjure/java/client/jaxrs/DialogueFeignClient.java b/conjure-java-jaxrs-client/src/main/java/com/palantir/conjure/java/client/jaxrs/DialogueFeignClient.java index aebb26f2d..5751bd746 100644 --- a/conjure-java-jaxrs-client/src/main/java/com/palantir/conjure/java/client/jaxrs/DialogueFeignClient.java +++ b/conjure-java-jaxrs-client/src/main/java/com/palantir/conjure/java/client/jaxrs/DialogueFeignClient.java @@ -43,6 +43,7 @@ import com.palantir.logsafe.UnsafeArg; import com.palantir.logsafe.exceptions.SafeIllegalStateException; import com.palantir.logsafe.exceptions.SafeRuntimeException; +import com.palantir.logsafe.exceptions.SafeUncheckedIoException; import feign.Request; import java.io.ByteArrayInputStream; import java.io.IOException; @@ -50,7 +51,7 @@ import java.io.InputStreamReader; import java.io.OutputStream; import java.io.Reader; -import java.io.UnsupportedEncodingException; +import java.io.StringReader; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; import java.util.Collection; @@ -143,11 +144,7 @@ private static boolean includeRequestHeader(String headerName) { } private static String urlDecode(String input) { - try { - return URLDecoder.decode(input, "UTF-8"); - } catch (UnsupportedEncodingException e) { - throw new SafeRuntimeException("Failed to decode path segment", e, UnsafeArg.of("encoded", input)); - } + return URLDecoder.decode(input, StandardCharsets.UTF_8); } private static Optional requestBody(Request request) { @@ -239,6 +236,17 @@ public InputStream asInputStream() { @Override public Reader asReader() { + Integer maybeLength = length(); + if (maybeLength != null && maybeLength < 8192) { + // Avoid InputStreamReader / HeapByteBuffer overhead for small (less than 8KiB) inputs, + // see https://github.com/FasterXML/jackson-core/pull/1081 + try (InputStream inputStream = asInputStream()) { + return new StringReader(new String(inputStream.readAllBytes(), StandardCharsets.UTF_8)); + } catch (IOException e) { + throw new SafeUncheckedIoException( + "Failed to read response body", e, SafeArg.of("length", maybeLength)); + } + } return new InputStreamReader(asInputStream(), StandardCharsets.UTF_8); }