From ecb1e9e2cb310d97a66dd7af1580ea491d5a55e7 Mon Sep 17 00:00:00 2001 From: Ilya Nemtsev Date: Sun, 16 Nov 2025 20:23:08 +0700 Subject: [PATCH] [JAVA][NATIVE] Add gzip capability (#22358) * add gzip capability * fixed test * added docstring * regenerated samples --- .../Java/libraries/native/ApiClient.mustache | 155 ++- .../Java/libraries/native/api.mustache | 230 +++-- .../codegen/java/JavaClientCodegenTest.java | 12 +- .../org/openapitools/client/ApiClient.java | 37 +- .../org/openapitools/client/api/AuthApi.java | 33 +- .../org/openapitools/client/api/BodyApi.java | 107 ++- .../org/openapitools/client/api/FormApi.java | 49 +- .../openapitools/client/api/HeaderApi.java | 26 +- .../org/openapitools/client/api/PathApi.java | 26 +- .../org/openapitools/client/api/QueryApi.java | 96 +- .../org/openapitools/client/ApiClient.java | 37 +- .../client/api/AnotherFakeApi.java | 80 +- .../openapitools/client/api/DefaultApi.java | 80 +- .../org/openapitools/client/api/FakeApi.java | 892 ++++++++++-------- .../client/api/FakeClassnameTags123Api.java | 80 +- .../org/openapitools/client/api/PetApi.java | 441 +++++---- .../org/openapitools/client/api/StoreApi.java | 223 +++-- .../org/openapitools/client/api/UserApi.java | 333 ++++--- .../org/openapitools/client/ApiClient.java | 37 +- .../org/openapitools/client/api/PetApi.java | 107 ++- .../org/openapitools/client/api/StoreApi.java | 60 +- .../org/openapitools/client/api/UserApi.java | 105 ++- .../org/openapitools/client/ApiClient.java | 37 +- .../client/api/AnotherFakeApi.java | 29 +- .../openapitools/client/api/DefaultApi.java | 29 +- .../org/openapitools/client/api/FakeApi.java | 239 +++-- .../client/api/FakeClassnameTags123Api.java | 29 +- .../org/openapitools/client/api/PetApi.java | 122 ++- .../org/openapitools/client/api/StoreApi.java | 60 +- .../org/openapitools/client/api/UserApi.java | 105 ++- 30 files changed, 2621 insertions(+), 1275 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/native/ApiClient.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/native/ApiClient.mustache index 6eae76c073e9..e49c8acc859f 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/native/ApiClient.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/native/ApiClient.mustache @@ -11,6 +11,10 @@ import org.openapitools.jackson.nullable.JsonNullableModule; {{/openApiNullable}} import java.io.InputStream; +import java.io.IOException; +{{#useGzipFeature}} +import java.io.ByteArrayOutputStream; +{{/useGzipFeature}} import java.net.URI; import java.net.URLEncoder; import java.net.http.HttpClient; @@ -25,6 +29,13 @@ import java.util.Collections; import java.util.List; import java.util.StringJoiner; import java.util.function.Consumer; +import java.util.Optional; +import java.util.zip.GZIPInputStream; +{{#useGzipFeature}} +import java.util.function.Supplier; +import java.util.Objects; +import java.util.zip.GZIPOutputStream; +{{/useGzipFeature}} import java.util.stream.Collectors; import static java.nio.charset.StandardCharsets.UTF_8; @@ -54,7 +65,7 @@ public class ApiClient { protected String basePath; protected Consumer interceptor; protected Consumer> responseInterceptor; - protected Consumer> asyncResponseInterceptor; + protected Consumer> asyncResponseInterceptor; protected Duration readTimeout; protected Duration connectTimeout; @@ -378,7 +389,7 @@ public class ApiClient { * of null resets the interceptor to a no-op. * @return This object. */ - public ApiClient setAsyncResponseInterceptor(Consumer> interceptor) { + public ApiClient setAsyncResponseInterceptor(Consumer> interceptor) { this.asyncResponseInterceptor = interceptor; return this; } @@ -388,7 +399,7 @@ public class ApiClient { * * @return The custom interceptor that was set, or null if there isn't any. */ - public Consumer> getAsyncResponseInterceptor() { + public Consumer> getAsyncResponseInterceptor() { return asyncResponseInterceptor; } @@ -448,4 +459,142 @@ public class ApiClient { public Duration getConnectTimeout() { return connectTimeout; } + + /** + * Returns the response body InputStream, transparently decoding gzip-compressed + * payloads when the server sets {@code Content-Encoding: gzip}. + * + * @param response HTTP response whose body should be consumed + * @return Original or decompressed InputStream for the response body + * @throws IOException if the response body cannot be accessed or wrapping fails + */ + public static InputStream getResponseBody(HttpResponse response) throws IOException { + if (response == null) { + return null; + } + InputStream body = response.body(); + if (body == null) { + return null; + } + Optional encoding = response.headers().firstValue("Content-Encoding"); + if (encoding.isPresent()) { + for (String token : encoding.get().split(",")) { + if ("gzip".equalsIgnoreCase(token.trim())) { + return new GZIPInputStream(body); + } + } + } + return body; + } + +{{#useGzipFeature}} + /** + * Wraps a request body supplier with a streaming GZIP compressor so large payloads + * can be sent without buffering the entire contents in memory. + * + * @param bodySupplier Supplies the original request body InputStream + * @return BodyPublisher that emits gzip-compressed bytes from the supplied stream + */ + public static HttpRequest.BodyPublisher gzipRequestBody(Supplier bodySupplier) { + Objects.requireNonNull(bodySupplier, "bodySupplier must not be null"); + return HttpRequest.BodyPublishers.ofInputStream(() -> new GzipCompressingInputStream(bodySupplier)); + } + + private static final class GzipCompressingInputStream extends InputStream { + private final Supplier supplier; + private final byte[] readBuffer = new byte[8192]; + private final ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + private InputStream source; + private GZIPOutputStream gzipStream; + private byte[] currentChunk = new byte[0]; + private int chunkPosition = 0; + private boolean finished = false; + + private GzipCompressingInputStream(Supplier supplier) { + this.supplier = Objects.requireNonNull(supplier, "bodySupplier must not be null"); + } + + private void ensureInitialized() throws IOException { + if (source == null) { + source = Objects.requireNonNull(supplier.get(), "bodySupplier returned null InputStream"); + gzipStream = new GZIPOutputStream(buffer, true); + } + } + + private boolean fillBuffer() throws IOException { + ensureInitialized(); + while (chunkPosition >= currentChunk.length) { + buffer.reset(); + if (finished) { + return false; + } + int bytesRead = source.read(readBuffer); + if (bytesRead == -1) { + gzipStream.finish(); + gzipStream.close(); + source.close(); + finished = true; + } else { + gzipStream.write(readBuffer, 0, bytesRead); + gzipStream.flush(); + } + currentChunk = buffer.toByteArray(); + chunkPosition = 0; + if (currentChunk.length == 0 && !finished) { + continue; + } + if (currentChunk.length == 0 && finished) { + return false; + } + return true; + } + return true; + } + + @Override + public int read() throws IOException { + if (!fillBuffer()) { + return -1; + } + return currentChunk[chunkPosition++] & 0xFF; + } + + @Override + public int read(byte[] b, int off, int len) throws IOException { + if (!fillBuffer()) { + return -1; + } + int bytesToCopy = Math.min(len, currentChunk.length - chunkPosition); + System.arraycopy(currentChunk, chunkPosition, b, off, bytesToCopy); + chunkPosition += bytesToCopy; + return bytesToCopy; + } + + @Override + public void close() throws IOException { + IOException exception = null; + if (source != null) { + try { + source.close(); + } catch (IOException e) { + exception = e; + } finally { + source = null; + } + } + if (gzipStream != null) { + try { + gzipStream.close(); + } catch (IOException e) { + exception = exception == null ? e : exception; + } finally { + gzipStream = null; + } + } + if (exception != null) { + throw exception; + } + } + } +{{/useGzipFeature}} } diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/native/api.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/native/api.mustache index 6436fceb91f7..b9ef07965948 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/native/api.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/native/api.mustache @@ -49,6 +49,9 @@ import java.util.Map; import java.util.Set; import java.util.Locale; import java.util.function.Consumer; +{{#useGzipFeature}} +import java.util.function.Supplier; +{{/useGzipFeature}} {{#asyncNative}} import java.util.concurrent.CompletableFuture; @@ -84,7 +87,7 @@ public class {{classname}} { private final Consumer memberVarInterceptor; private final Duration memberVarReadTimeout; private final Consumer> memberVarResponseInterceptor; - private final Consumer> memberVarAsyncResponseInterceptor; + private final Consumer> memberVarAsyncResponseInterceptor; public {{classname}}() { this(Configuration.getDefaultApiClient()); @@ -102,15 +105,33 @@ public class {{classname}} { {{#asyncNative}} - private ApiException getApiException(String operationId, HttpResponse response) { - String message = formatExceptionMessage(operationId, response.statusCode(), response.body()); - return new ApiException(response.statusCode(), message, response.headers(), response.body()); + private ApiException getApiException(String operationId, HttpResponse response) { + try { + InputStream responseBody = ApiClient.getResponseBody(response); + String body = null; + if (responseBody != null) { + body = new String(responseBody.readAllBytes()); + responseBody.close(); + } + String message = formatExceptionMessage(operationId, response.statusCode(), body); + return new ApiException(response.statusCode(), message, response.headers(), body); + } catch (IOException e) { + return new ApiException(e); + } } {{/asyncNative}} {{^asyncNative}} protected ApiException getApiException(String operationId, HttpResponse response) throws IOException { - String body = response.body() == null ? null : new String(response.body().readAllBytes()); + InputStream responseBody = ApiClient.getResponseBody(response); + String body = null; + try { + body = responseBody == null ? null : new String(responseBody.readAllBytes()); + } finally { + if (responseBody != null) { + responseBody.close(); + } + } String message = formatExceptionMessage(operationId, response.statusCode(), body); return new ApiException(response.statusCode(), message, response.headers(), body); } @@ -130,10 +151,13 @@ public class {{classname}} { * @return File * @throws ApiException If fail to read file content from response and write to disk */ - public File downloadFileFromResponse(HttpResponse response) throws ApiException { + public File downloadFileFromResponse(HttpResponse response, InputStream responseBody) throws ApiException { + if (responseBody == null) { + throw new ApiException(new IOException("Response body is empty")); + } try { File file = prepareDownloadFile(response); - java.nio.file.Files.copy(response.body(), file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); + java.nio.file.Files.copy(responseBody, file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); return file; } catch (IOException e) { throw new ApiException(e); @@ -349,27 +373,8 @@ public class {{classname}} { {{/asyncNative}} {{#asyncNative}} try { - HttpRequest.Builder localVarRequestBuilder = {{operationId}}RequestBuilder({{#allParams}}{{paramName}}{{^-last}}, {{/-last}}{{/allParams}}{{#hasParams}}, {{/hasParams}}headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("{{operationId}}", localVarResponse)); - } - {{#returnType}} - try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference<{{{returnType}}}>() {}) - ); - } catch (IOException e) { - return CompletableFuture.failedFuture(new ApiException(e)); - } - {{/returnType}} - {{^returnType}} - return CompletableFuture.completedFuture(null); - {{/returnType}} - }); + return {{operationId}}WithHttpInfo({{#allParams}}{{paramName}}{{^-last}}, {{/-last}}{{/allParams}}{{#hasParams}}, {{/hasParams}}headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -430,6 +435,7 @@ public class {{classname}} { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("{{operationId}}", localVarResponse); @@ -438,7 +444,8 @@ public class {{classname}} { // for plain text response if (localVarResponse.headers().map().containsKey("Content-Type") && "text/plain".equalsIgnoreCase(localVarResponse.headers().map().get("Content-Type").get(0).split(";")[0].trim())) { - java.util.Scanner s = new java.util.Scanner(localVarResponse.body()).useDelimiter("\\A"); + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + java.util.Scanner s = new java.util.Scanner(localVarResponseBody == null ? InputStream.nullInputStream() : localVarResponseBody).useDelimiter("\\A"); String responseBodyText = s.hasNext() ? s.next() : ""; return new ApiResponse( localVarResponse.statusCode(), @@ -460,7 +467,8 @@ public class {{classname}} { {{! A fix for that problem is to read it into a string and remove those characters, but if we need to read it before giving it to jackson to fix the string then just reading it into a string as is to do an emptiness check is the cleaner solution. }} {{! We could also manipulate the inputstream to remove that bad character, but string manipulation is easier to read and this codepath is not asyncronus so we do not gain anything by reading the stream later. }} {{! This fix does make it unsuitable for large amounts of data because `InputStream.readAllbytes` is not meant for it, but a synchronous client is already not the right tool for that.}} - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse<{{{returnType}}}>( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -469,17 +477,16 @@ public class {{classname}} { } {{^isResponseFile}}{{#isResponseBinary}} - Byte[] responseValue = localVarResponse.body().readAllBytes(); + Byte[] responseValue = localVarResponseBody.readAllBytes(); {{/isResponseBinary}}{{/isResponseFile}} {{#isResponseFile}} // Handle file downloading. - File responseValue = downloadFileFromResponse(localVarResponse); + File responseValue = downloadFileFromResponse(localVarResponse, localVarResponseBody); {{/isResponseFile}} {{^isResponseBinary}}{{^isResponseFile}} - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); {{{returnType}}} responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference<{{{returnType}}}>() {}); {{/isResponseFile}}{{/isResponseBinary}} - localVarResponse.body().close(); return new ApiResponse<{{{returnType}}}>( localVarResponse.statusCode(), @@ -488,6 +495,10 @@ public class {{classname}} { ); {{/returnType}} {{^returnType}} + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } return new ApiResponse<{{{returnType}}}>( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -496,13 +507,9 @@ public class {{classname}} { {{/returnType}} {{/vendorExtensions.x-java-text-plain-string}} } finally { - {{^returnType}} - // Drain the InputStream - while (localVarResponse.body().read() != -1) { - // Ignore + if (localVarResponseBody != null) { + localVarResponseBody.close(); } - localVarResponse.body().close(); - {{/returnType}} } } catch (IOException e) { throw new ApiException(e); @@ -517,31 +524,78 @@ public class {{classname}} { HttpRequest.Builder localVarRequestBuilder = {{operationId}}RequestBuilder({{#allParams}}{{paramName}}{{^-last}}, {{/-last}}{{/allParams}}{{#hasParams}}, {{/hasParams}}headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } if (localVarResponse.statusCode()/ 100 != 2) { return CompletableFuture.failedFuture(getApiException("{{operationId}}", localVarResponse)); } - {{#returnType}} try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - new ApiResponse<{{{returnType}}}>( - localVarResponse.statusCode(), - localVarResponse.headers().map(), - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference<{{{returnType}}}>() {})) - ); + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + {{#vendorExtensions.x-java-text-plain-string}} + if (localVarResponse.headers().map().containsKey("Content-Type") && + "text/plain".equalsIgnoreCase(localVarResponse.headers().map().get("Content-Type").get(0).split(";")[0].trim())) { + java.util.Scanner s = new java.util.Scanner(localVarResponseBody == null ? InputStream.nullInputStream() : localVarResponseBody).useDelimiter("\\A"); + String responseBodyText = s.hasNext() ? s.next() : ""; + return CompletableFuture.completedFuture( + new ApiResponse( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + responseBodyText + ) + ); + } else { + return CompletableFuture.failedFuture(new RuntimeException("Error! The response Content-Type is supposed to be `text/plain` but it's not: " + localVarResponse)); + } + {{/vendorExtensions.x-java-text-plain-string}} + {{^vendorExtensions.x-java-text-plain-string}} + {{#returnType}} + if (localVarResponseBody == null) { + return CompletableFuture.completedFuture( + new ApiResponse<{{{returnType}}}>( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + null + ) + ); + } + {{^isResponseFile}}{{#isResponseBinary}} + Byte[] responseValue = localVarResponseBody.readAllBytes(); + {{/isResponseBinary}}{{/isResponseFile}} + {{#isResponseFile}} + File responseValue = downloadFileFromResponse(localVarResponse, localVarResponseBody); + {{/isResponseFile}} + {{^isResponseBinary}}{{^isResponseFile}} + String responseBody = new String(localVarResponseBody.readAllBytes()); + {{{returnType}}} responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference<{{{returnType}}}>() {}); + {{/isResponseFile}}{{/isResponseBinary}} + return CompletableFuture.completedFuture( + new ApiResponse<{{{returnType}}}>( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + responseValue + ) + ); + {{/returnType}} + {{^returnType}} + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } + return CompletableFuture.completedFuture( + new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) + ); + {{/returnType}} + {{/vendorExtensions.x-java-text-plain-string}} + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } } catch (IOException e) { return CompletableFuture.failedFuture(new ApiException(e)); } - {{/returnType}} - {{^returnType}} - return CompletableFuture.completedFuture( - new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) - ); - {{/returnType}} } ); } @@ -644,15 +698,32 @@ public class {{classname}} { localVarRequestBuilder.header("Content-Type", "{{#hasConsumes}}{{#consumes}}{{#-first}}{{{mediaType}}}{{/-first}}{{/consumes}}{{/hasConsumes}}{{#hasConsumes}}{{^consumes}}application/json{{/consumes}}{{/hasConsumes}}{{^hasConsumes}}application/json{{/hasConsumes}}"); {{/bodyParam}} localVarRequestBuilder.header("Accept", "{{#hasProduces}}{{#produces}}{{{mediaType}}}{{^-last}}, {{/-last}}{{/produces}}{{/hasProduces}}{{#hasProduces}}{{^produces}}application/json{{/produces}}{{/hasProduces}}{{^hasProduces}}application/json{{/hasProduces}}"); + {{#useGzipFeature}} + localVarRequestBuilder.header("Accept-Encoding", "gzip"); + {{/useGzipFeature}} {{#bodyParam}} {{#isString}} + {{#useGzipFeature}} + Supplier localVarRequestBodySupplier = () -> new ByteArrayInputStream({{paramName}}.getBytes(java.nio.charset.StandardCharsets.UTF_8)); + localVarRequestBuilder.header("Content-Encoding", "gzip"); + localVarRequestBuilder.method("{{httpMethod}}", ApiClient.gzipRequestBody(localVarRequestBodySupplier)); + {{/useGzipFeature}} + {{^useGzipFeature}} localVarRequestBuilder.method("{{httpMethod}}", HttpRequest.BodyPublishers.ofString({{paramName}})); + {{/useGzipFeature}} {{/isString}} {{^isString}} try { byte[] localVarPostBody = memberVarObjectMapper.writeValueAsBytes({{paramName}}); + {{#useGzipFeature}} + Supplier localVarRequestBodySupplier = () -> new ByteArrayInputStream(localVarPostBody); + localVarRequestBuilder.header("Content-Encoding", "gzip"); + localVarRequestBuilder.method("{{httpMethod}}", ApiClient.gzipRequestBody(localVarRequestBodySupplier)); + {{/useGzipFeature}} + {{^useGzipFeature}} localVarRequestBuilder.method("{{httpMethod}}", HttpRequest.BodyPublishers.ofByteArray(localVarPostBody)); + {{/useGzipFeature}} } catch (IOException e) { throw new ApiException(e); } @@ -690,6 +761,39 @@ public class {{classname}} { {{/isArray}} {{/formParams}} HttpEntity entity = multiPartBuilder.build(); + {{#useGzipFeature}} + Supplier formDataSupplier; + if (hasFiles) { + Pipe pipe; + try { + pipe = Pipe.open(); + } catch (IOException e) { + throw new RuntimeException(e); + } + new Thread(() -> { + try (OutputStream outputStream = Channels.newOutputStream(pipe.sink())) { + entity.writeTo(outputStream); + } catch (IOException e) { + e.printStackTrace(); + } + }).start(); + formDataSupplier = () -> Channels.newInputStream(pipe.source()); + } else { + ByteArrayOutputStream formOutputStream = new ByteArrayOutputStream(); + try { + entity.writeTo(formOutputStream); + } catch (IOException e) { + throw new RuntimeException(e); + } + byte[] formBytes = formOutputStream.toByteArray(); + formDataSupplier = () -> new ByteArrayInputStream(formBytes); + } + localVarRequestBuilder + .header("Content-Type", entity.getContentType().getValue()) + .header("Content-Encoding", "gzip") + .method("{{httpMethod}}", ApiClient.gzipRequestBody(formDataSupplier)); + {{/useGzipFeature}} + {{^useGzipFeature}} HttpRequest.BodyPublisher formDataPublisher; if (hasFiles) { Pipe pipe; @@ -713,12 +817,14 @@ public class {{classname}} { } catch (IOException e) { throw new RuntimeException(e); } + byte[] formBytes = formOutputStream.toByteArray(); formDataPublisher = HttpRequest.BodyPublishers - .ofInputStream(() -> new ByteArrayInputStream(formOutputStream.toByteArray())); + .ofInputStream(() -> new ByteArrayInputStream(formBytes)); } localVarRequestBuilder .header("Content-Type", entity.getContentType().getValue()) .method("{{httpMethod}}", formDataPublisher); + {{/useGzipFeature}} {{/isMultipart}} {{^isMultipart}} List formValues = new ArrayList<>(); @@ -743,10 +849,20 @@ public class {{classname}} { } catch (IOException e) { throw new RuntimeException(e); } + byte[] formBytes = formOutputStream.toByteArray(); + {{#useGzipFeature}} + Supplier formDataSupplier = () -> new ByteArrayInputStream(formBytes); + localVarRequestBuilder + .header("Content-Type", entity.getContentType().getValue()) + .header("Content-Encoding", "gzip") + .method("{{httpMethod}}", ApiClient.gzipRequestBody(formDataSupplier)); + {{/useGzipFeature}} + {{^useGzipFeature}} localVarRequestBuilder .header("Content-Type", entity.getContentType().getValue()) .method("{{httpMethod}}", HttpRequest.BodyPublishers - .ofInputStream(() -> new ByteArrayInputStream(formOutputStream.toByteArray()))); + .ofInputStream(() -> new ByteArrayInputStream(formBytes))); + {{/useGzipFeature}} {{/isMultipart}} {{/hasFormParams}} {{^hasFormParams}} diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java index ac6c08a65201..1547e5054d9e 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java @@ -3533,8 +3533,9 @@ public class JavaClientCodegenTest { assertNotNull(apiFile); JavaFileAssert.assertThat(apiFile).fileContains( - //reading the body into a string, then checking if it is blank. - "String responseBody = new String(localVarResponse.body().readAllBytes());", + // reading the body into a string after decompression, then checking if it is blank. + "localVarResponseBody = ApiClient.getResponseBody(localVarResponse);", + "String responseBody = new String(localVarResponseBody.readAllBytes());", "responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {})" ); } @@ -3627,9 +3628,10 @@ public class JavaClientCodegenTest { File apiFile = files.get("DefaultApi.java"); assertNotNull(apiFile); - JavaFileAssert.assertThat(apiFile).fileDoesNotContain( - //reading the body into a string, then checking if it is blank. - "String responseBody = new String(localVarResponse.body().readAllBytes());", + JavaFileAssert.assertThat(apiFile).fileContains( + // async path should also decompress before reading the body. + "InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse);", + "String responseBody = new String(localVarResponseBody.readAllBytes());", "responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {})" ); } diff --git a/samples/client/echo_api/java/native/src/main/java/org/openapitools/client/ApiClient.java b/samples/client/echo_api/java/native/src/main/java/org/openapitools/client/ApiClient.java index 9264b1aeb95a..261dec248d2a 100644 --- a/samples/client/echo_api/java/native/src/main/java/org/openapitools/client/ApiClient.java +++ b/samples/client/echo_api/java/native/src/main/java/org/openapitools/client/ApiClient.java @@ -20,6 +20,7 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import org.openapitools.jackson.nullable.JsonNullableModule; import java.io.InputStream; +import java.io.IOException; import java.net.URI; import java.net.URLEncoder; import java.net.http.HttpClient; @@ -34,6 +35,8 @@ import java.util.Collections; import java.util.List; import java.util.StringJoiner; import java.util.function.Consumer; +import java.util.Optional; +import java.util.zip.GZIPInputStream; import java.util.stream.Collectors; import static java.nio.charset.StandardCharsets.UTF_8; @@ -62,7 +65,7 @@ public class ApiClient { protected String basePath; protected Consumer interceptor; protected Consumer> responseInterceptor; - protected Consumer> asyncResponseInterceptor; + protected Consumer> asyncResponseInterceptor; protected Duration readTimeout; protected Duration connectTimeout; @@ -384,7 +387,7 @@ public class ApiClient { * of null resets the interceptor to a no-op. * @return This object. */ - public ApiClient setAsyncResponseInterceptor(Consumer> interceptor) { + public ApiClient setAsyncResponseInterceptor(Consumer> interceptor) { this.asyncResponseInterceptor = interceptor; return this; } @@ -394,7 +397,7 @@ public class ApiClient { * * @return The custom interceptor that was set, or null if there isn't any. */ - public Consumer> getAsyncResponseInterceptor() { + public Consumer> getAsyncResponseInterceptor() { return asyncResponseInterceptor; } @@ -454,4 +457,32 @@ public class ApiClient { public Duration getConnectTimeout() { return connectTimeout; } + + /** + * Returns the response body InputStream, transparently decoding gzip-compressed + * payloads when the server sets {@code Content-Encoding: gzip}. + * + * @param response HTTP response whose body should be consumed + * @return Original or decompressed InputStream for the response body + * @throws IOException if the response body cannot be accessed or wrapping fails + */ + public static InputStream getResponseBody(HttpResponse response) throws IOException { + if (response == null) { + return null; + } + InputStream body = response.body(); + if (body == null) { + return null; + } + Optional encoding = response.headers().firstValue("Content-Encoding"); + if (encoding.isPresent()) { + for (String token : encoding.get().split(",")) { + if ("gzip".equalsIgnoreCase(token.trim())) { + return new GZIPInputStream(body); + } + } + } + return body; + } + } diff --git a/samples/client/echo_api/java/native/src/main/java/org/openapitools/client/api/AuthApi.java b/samples/client/echo_api/java/native/src/main/java/org/openapitools/client/api/AuthApi.java index d70626abab49..a53cf681df7e 100644 --- a/samples/client/echo_api/java/native/src/main/java/org/openapitools/client/api/AuthApi.java +++ b/samples/client/echo_api/java/native/src/main/java/org/openapitools/client/api/AuthApi.java @@ -73,7 +73,7 @@ public class AuthApi { private final Consumer memberVarInterceptor; private final Duration memberVarReadTimeout; private final Consumer> memberVarResponseInterceptor; - private final Consumer> memberVarAsyncResponseInterceptor; + private final Consumer> memberVarAsyncResponseInterceptor; public AuthApi() { this(Configuration.getDefaultApiClient()); @@ -91,7 +91,15 @@ public class AuthApi { protected ApiException getApiException(String operationId, HttpResponse response) throws IOException { - String body = response.body() == null ? null : new String(response.body().readAllBytes()); + InputStream responseBody = ApiClient.getResponseBody(response); + String body = null; + try { + body = responseBody == null ? null : new String(responseBody.readAllBytes()); + } finally { + if (responseBody != null) { + responseBody.close(); + } + } String message = formatExceptionMessage(operationId, response.statusCode(), body); return new ApiException(response.statusCode(), message, response.headers(), body); } @@ -110,10 +118,13 @@ public class AuthApi { * @return File * @throws ApiException If fail to read file content from response and write to disk */ - public File downloadFileFromResponse(HttpResponse response) throws ApiException { + public File downloadFileFromResponse(HttpResponse response, InputStream responseBody) throws ApiException { + if (responseBody == null) { + throw new ApiException(new IOException("Response body is empty")); + } try { File file = prepareDownloadFile(response); - java.nio.file.Files.copy(response.body(), file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); + java.nio.file.Files.copy(responseBody, file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); return file; } catch (IOException e) { throw new ApiException(e); @@ -199,6 +210,7 @@ public class AuthApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testAuthHttpBasic", localVarResponse); @@ -206,7 +218,8 @@ public class AuthApi { // for plain text response if (localVarResponse.headers().map().containsKey("Content-Type") && "text/plain".equalsIgnoreCase(localVarResponse.headers().map().get("Content-Type").get(0).split(";")[0].trim())) { - java.util.Scanner s = new java.util.Scanner(localVarResponse.body()).useDelimiter("\\A"); + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + java.util.Scanner s = new java.util.Scanner(localVarResponseBody == null ? InputStream.nullInputStream() : localVarResponseBody).useDelimiter("\\A"); String responseBodyText = s.hasNext() ? s.next() : ""; return new ApiResponse( localVarResponse.statusCode(), @@ -217,6 +230,9 @@ public class AuthApi { throw new RuntimeException("Error! The response Content-Type is supposed to be `text/plain` but it's not: " + localVarResponse); } } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -297,6 +313,7 @@ public class AuthApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testAuthHttpBearer", localVarResponse); @@ -304,7 +321,8 @@ public class AuthApi { // for plain text response if (localVarResponse.headers().map().containsKey("Content-Type") && "text/plain".equalsIgnoreCase(localVarResponse.headers().map().get("Content-Type").get(0).split(";")[0].trim())) { - java.util.Scanner s = new java.util.Scanner(localVarResponse.body()).useDelimiter("\\A"); + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + java.util.Scanner s = new java.util.Scanner(localVarResponseBody == null ? InputStream.nullInputStream() : localVarResponseBody).useDelimiter("\\A"); String responseBodyText = s.hasNext() ? s.next() : ""; return new ApiResponse( localVarResponse.statusCode(), @@ -315,6 +333,9 @@ public class AuthApi { throw new RuntimeException("Error! The response Content-Type is supposed to be `text/plain` but it's not: " + localVarResponse); } } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); diff --git a/samples/client/echo_api/java/native/src/main/java/org/openapitools/client/api/BodyApi.java b/samples/client/echo_api/java/native/src/main/java/org/openapitools/client/api/BodyApi.java index 68178055cac5..c29f40fc17c6 100644 --- a/samples/client/echo_api/java/native/src/main/java/org/openapitools/client/api/BodyApi.java +++ b/samples/client/echo_api/java/native/src/main/java/org/openapitools/client/api/BodyApi.java @@ -83,7 +83,7 @@ public class BodyApi { private final Consumer memberVarInterceptor; private final Duration memberVarReadTimeout; private final Consumer> memberVarResponseInterceptor; - private final Consumer> memberVarAsyncResponseInterceptor; + private final Consumer> memberVarAsyncResponseInterceptor; public BodyApi() { this(Configuration.getDefaultApiClient()); @@ -101,7 +101,15 @@ public class BodyApi { protected ApiException getApiException(String operationId, HttpResponse response) throws IOException { - String body = response.body() == null ? null : new String(response.body().readAllBytes()); + InputStream responseBody = ApiClient.getResponseBody(response); + String body = null; + try { + body = responseBody == null ? null : new String(responseBody.readAllBytes()); + } finally { + if (responseBody != null) { + responseBody.close(); + } + } String message = formatExceptionMessage(operationId, response.statusCode(), body); return new ApiException(response.statusCode(), message, response.headers(), body); } @@ -120,10 +128,13 @@ public class BodyApi { * @return File * @throws ApiException If fail to read file content from response and write to disk */ - public File downloadFileFromResponse(HttpResponse response) throws ApiException { + public File downloadFileFromResponse(HttpResponse response, InputStream responseBody) throws ApiException { + if (responseBody == null) { + throw new ApiException(new IOException("Response body is empty")); + } try { File file = prepareDownloadFile(response); - java.nio.file.Files.copy(response.body(), file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); + java.nio.file.Files.copy(responseBody, file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); return file; } catch (IOException e) { throw new ApiException(e); @@ -209,11 +220,13 @@ public class BodyApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testBinaryGif", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -223,9 +236,8 @@ public class BodyApi { // Handle file downloading. - File responseValue = downloadFileFromResponse(localVarResponse); + File responseValue = downloadFileFromResponse(localVarResponse, localVarResponseBody); - localVarResponse.body().close(); return new ApiResponse( localVarResponse.statusCode(), @@ -233,6 +245,9 @@ public class BodyApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -317,6 +332,7 @@ public class BodyApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testBodyApplicationOctetstreamBinary", localVarResponse); @@ -324,7 +340,8 @@ public class BodyApi { // for plain text response if (localVarResponse.headers().map().containsKey("Content-Type") && "text/plain".equalsIgnoreCase(localVarResponse.headers().map().get("Content-Type").get(0).split(";")[0].trim())) { - java.util.Scanner s = new java.util.Scanner(localVarResponse.body()).useDelimiter("\\A"); + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + java.util.Scanner s = new java.util.Scanner(localVarResponseBody == null ? InputStream.nullInputStream() : localVarResponseBody).useDelimiter("\\A"); String responseBodyText = s.hasNext() ? s.next() : ""; return new ApiResponse( localVarResponse.statusCode(), @@ -335,6 +352,9 @@ public class BodyApi { throw new RuntimeException("Error! The response Content-Type is supposed to be `text/plain` but it's not: " + localVarResponse); } } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -425,6 +445,7 @@ public class BodyApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testBodyMultipartFormdataArrayOfBinary", localVarResponse); @@ -432,7 +453,8 @@ public class BodyApi { // for plain text response if (localVarResponse.headers().map().containsKey("Content-Type") && "text/plain".equalsIgnoreCase(localVarResponse.headers().map().get("Content-Type").get(0).split(";")[0].trim())) { - java.util.Scanner s = new java.util.Scanner(localVarResponse.body()).useDelimiter("\\A"); + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + java.util.Scanner s = new java.util.Scanner(localVarResponseBody == null ? InputStream.nullInputStream() : localVarResponseBody).useDelimiter("\\A"); String responseBodyText = s.hasNext() ? s.next() : ""; return new ApiResponse( localVarResponse.statusCode(), @@ -443,6 +465,9 @@ public class BodyApi { throw new RuntimeException("Error! The response Content-Type is supposed to be `text/plain` but it's not: " + localVarResponse); } } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -497,8 +522,9 @@ public class BodyApi { } catch (IOException e) { throw new RuntimeException(e); } + byte[] formBytes = formOutputStream.toByteArray(); formDataPublisher = HttpRequest.BodyPublishers - .ofInputStream(() -> new ByteArrayInputStream(formOutputStream.toByteArray())); + .ofInputStream(() -> new ByteArrayInputStream(formBytes)); } localVarRequestBuilder .header("Content-Type", entity.getContentType().getValue()) @@ -566,6 +592,7 @@ public class BodyApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testBodyMultipartFormdataSingleBinary", localVarResponse); @@ -573,7 +600,8 @@ public class BodyApi { // for plain text response if (localVarResponse.headers().map().containsKey("Content-Type") && "text/plain".equalsIgnoreCase(localVarResponse.headers().map().get("Content-Type").get(0).split(";")[0].trim())) { - java.util.Scanner s = new java.util.Scanner(localVarResponse.body()).useDelimiter("\\A"); + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + java.util.Scanner s = new java.util.Scanner(localVarResponseBody == null ? InputStream.nullInputStream() : localVarResponseBody).useDelimiter("\\A"); String responseBodyText = s.hasNext() ? s.next() : ""; return new ApiResponse( localVarResponse.statusCode(), @@ -584,6 +612,9 @@ public class BodyApi { throw new RuntimeException("Error! The response Content-Type is supposed to be `text/plain` but it's not: " + localVarResponse); } } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -632,8 +663,9 @@ public class BodyApi { } catch (IOException e) { throw new RuntimeException(e); } + byte[] formBytes = formOutputStream.toByteArray(); formDataPublisher = HttpRequest.BodyPublishers - .ofInputStream(() -> new ByteArrayInputStream(formOutputStream.toByteArray())); + .ofInputStream(() -> new ByteArrayInputStream(formBytes)); } localVarRequestBuilder .header("Content-Type", entity.getContentType().getValue()) @@ -701,11 +733,13 @@ public class BodyApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testEchoBodyAllOfPet", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -715,10 +749,9 @@ public class BodyApi { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); Pet responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); - localVarResponse.body().close(); return new ApiResponse( localVarResponse.statusCode(), @@ -726,6 +759,9 @@ public class BodyApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -816,6 +852,7 @@ public class BodyApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testEchoBodyFreeFormObjectResponseString", localVarResponse); @@ -823,7 +860,8 @@ public class BodyApi { // for plain text response if (localVarResponse.headers().map().containsKey("Content-Type") && "text/plain".equalsIgnoreCase(localVarResponse.headers().map().get("Content-Type").get(0).split(";")[0].trim())) { - java.util.Scanner s = new java.util.Scanner(localVarResponse.body()).useDelimiter("\\A"); + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + java.util.Scanner s = new java.util.Scanner(localVarResponseBody == null ? InputStream.nullInputStream() : localVarResponseBody).useDelimiter("\\A"); String responseBodyText = s.hasNext() ? s.next() : ""; return new ApiResponse( localVarResponse.statusCode(), @@ -834,6 +872,9 @@ public class BodyApi { throw new RuntimeException("Error! The response Content-Type is supposed to be `text/plain` but it's not: " + localVarResponse); } } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -924,11 +965,13 @@ public class BodyApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testEchoBodyPet", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -938,10 +981,9 @@ public class BodyApi { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); Pet responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); - localVarResponse.body().close(); return new ApiResponse( localVarResponse.statusCode(), @@ -949,6 +991,9 @@ public class BodyApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -1039,6 +1084,7 @@ public class BodyApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testEchoBodyPetResponseString", localVarResponse); @@ -1046,7 +1092,8 @@ public class BodyApi { // for plain text response if (localVarResponse.headers().map().containsKey("Content-Type") && "text/plain".equalsIgnoreCase(localVarResponse.headers().map().get("Content-Type").get(0).split(";")[0].trim())) { - java.util.Scanner s = new java.util.Scanner(localVarResponse.body()).useDelimiter("\\A"); + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + java.util.Scanner s = new java.util.Scanner(localVarResponseBody == null ? InputStream.nullInputStream() : localVarResponseBody).useDelimiter("\\A"); String responseBodyText = s.hasNext() ? s.next() : ""; return new ApiResponse( localVarResponse.statusCode(), @@ -1057,6 +1104,9 @@ public class BodyApi { throw new RuntimeException("Error! The response Content-Type is supposed to be `text/plain` but it's not: " + localVarResponse); } } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -1147,11 +1197,13 @@ public class BodyApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testEchoBodyStringEnum", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -1161,10 +1213,9 @@ public class BodyApi { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); StringEnumRef responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); - localVarResponse.body().close(); return new ApiResponse( localVarResponse.statusCode(), @@ -1172,6 +1223,9 @@ public class BodyApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -1262,6 +1316,7 @@ public class BodyApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testEchoBodyTagResponseString", localVarResponse); @@ -1269,7 +1324,8 @@ public class BodyApi { // for plain text response if (localVarResponse.headers().map().containsKey("Content-Type") && "text/plain".equalsIgnoreCase(localVarResponse.headers().map().get("Content-Type").get(0).split(";")[0].trim())) { - java.util.Scanner s = new java.util.Scanner(localVarResponse.body()).useDelimiter("\\A"); + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + java.util.Scanner s = new java.util.Scanner(localVarResponseBody == null ? InputStream.nullInputStream() : localVarResponseBody).useDelimiter("\\A"); String responseBodyText = s.hasNext() ? s.next() : ""; return new ApiResponse( localVarResponse.statusCode(), @@ -1280,6 +1336,9 @@ public class BodyApi { throw new RuntimeException("Error! The response Content-Type is supposed to be `text/plain` but it's not: " + localVarResponse); } } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); diff --git a/samples/client/echo_api/java/native/src/main/java/org/openapitools/client/api/FormApi.java b/samples/client/echo_api/java/native/src/main/java/org/openapitools/client/api/FormApi.java index 29f94ec8c888..9a68ac1a4cf6 100644 --- a/samples/client/echo_api/java/native/src/main/java/org/openapitools/client/api/FormApi.java +++ b/samples/client/echo_api/java/native/src/main/java/org/openapitools/client/api/FormApi.java @@ -80,7 +80,7 @@ public class FormApi { private final Consumer memberVarInterceptor; private final Duration memberVarReadTimeout; private final Consumer> memberVarResponseInterceptor; - private final Consumer> memberVarAsyncResponseInterceptor; + private final Consumer> memberVarAsyncResponseInterceptor; public FormApi() { this(Configuration.getDefaultApiClient()); @@ -98,7 +98,15 @@ public class FormApi { protected ApiException getApiException(String operationId, HttpResponse response) throws IOException { - String body = response.body() == null ? null : new String(response.body().readAllBytes()); + InputStream responseBody = ApiClient.getResponseBody(response); + String body = null; + try { + body = responseBody == null ? null : new String(responseBody.readAllBytes()); + } finally { + if (responseBody != null) { + responseBody.close(); + } + } String message = formatExceptionMessage(operationId, response.statusCode(), body); return new ApiException(response.statusCode(), message, response.headers(), body); } @@ -117,10 +125,13 @@ public class FormApi { * @return File * @throws ApiException If fail to read file content from response and write to disk */ - public File downloadFileFromResponse(HttpResponse response) throws ApiException { + public File downloadFileFromResponse(HttpResponse response, InputStream responseBody) throws ApiException { + if (responseBody == null) { + throw new ApiException(new IOException("Response body is empty")); + } try { File file = prepareDownloadFile(response); - java.nio.file.Files.copy(response.body(), file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); + java.nio.file.Files.copy(responseBody, file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); return file; } catch (IOException e) { throw new ApiException(e); @@ -218,6 +229,7 @@ public class FormApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testFormIntegerBooleanString", localVarResponse); @@ -225,7 +237,8 @@ public class FormApi { // for plain text response if (localVarResponse.headers().map().containsKey("Content-Type") && "text/plain".equalsIgnoreCase(localVarResponse.headers().map().get("Content-Type").get(0).split(";")[0].trim())) { - java.util.Scanner s = new java.util.Scanner(localVarResponse.body()).useDelimiter("\\A"); + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + java.util.Scanner s = new java.util.Scanner(localVarResponseBody == null ? InputStream.nullInputStream() : localVarResponseBody).useDelimiter("\\A"); String responseBodyText = s.hasNext() ? s.next() : ""; return new ApiResponse( localVarResponse.statusCode(), @@ -236,6 +249,9 @@ public class FormApi { throw new RuntimeException("Error! The response Content-Type is supposed to be `text/plain` but it's not: " + localVarResponse); } } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -273,10 +289,11 @@ public class FormApi { } catch (IOException e) { throw new RuntimeException(e); } + byte[] formBytes = formOutputStream.toByteArray(); localVarRequestBuilder .header("Content-Type", entity.getContentType().getValue()) .method("POST", HttpRequest.BodyPublishers - .ofInputStream(() -> new ByteArrayInputStream(formOutputStream.toByteArray()))); + .ofInputStream(() -> new ByteArrayInputStream(formBytes))); if (memberVarReadTimeout != null) { localVarRequestBuilder.timeout(memberVarReadTimeout); } @@ -340,6 +357,7 @@ public class FormApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testFormObjectMultipart", localVarResponse); @@ -347,7 +365,8 @@ public class FormApi { // for plain text response if (localVarResponse.headers().map().containsKey("Content-Type") && "text/plain".equalsIgnoreCase(localVarResponse.headers().map().get("Content-Type").get(0).split(";")[0].trim())) { - java.util.Scanner s = new java.util.Scanner(localVarResponse.body()).useDelimiter("\\A"); + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + java.util.Scanner s = new java.util.Scanner(localVarResponseBody == null ? InputStream.nullInputStream() : localVarResponseBody).useDelimiter("\\A"); String responseBodyText = s.hasNext() ? s.next() : ""; return new ApiResponse( localVarResponse.statusCode(), @@ -358,6 +377,9 @@ public class FormApi { throw new RuntimeException("Error! The response Content-Type is supposed to be `text/plain` but it's not: " + localVarResponse); } } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -411,8 +433,9 @@ public class FormApi { } catch (IOException e) { throw new RuntimeException(e); } + byte[] formBytes = formOutputStream.toByteArray(); formDataPublisher = HttpRequest.BodyPublishers - .ofInputStream(() -> new ByteArrayInputStream(formOutputStream.toByteArray())); + .ofInputStream(() -> new ByteArrayInputStream(formBytes)); } localVarRequestBuilder .header("Content-Type", entity.getContentType().getValue()) @@ -500,6 +523,7 @@ public class FormApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testFormOneof", localVarResponse); @@ -507,7 +531,8 @@ public class FormApi { // for plain text response if (localVarResponse.headers().map().containsKey("Content-Type") && "text/plain".equalsIgnoreCase(localVarResponse.headers().map().get("Content-Type").get(0).split(";")[0].trim())) { - java.util.Scanner s = new java.util.Scanner(localVarResponse.body()).useDelimiter("\\A"); + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + java.util.Scanner s = new java.util.Scanner(localVarResponseBody == null ? InputStream.nullInputStream() : localVarResponseBody).useDelimiter("\\A"); String responseBodyText = s.hasNext() ? s.next() : ""; return new ApiResponse( localVarResponse.statusCode(), @@ -518,6 +543,9 @@ public class FormApi { throw new RuntimeException("Error! The response Content-Type is supposed to be `text/plain` but it's not: " + localVarResponse); } } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -564,10 +592,11 @@ public class FormApi { } catch (IOException e) { throw new RuntimeException(e); } + byte[] formBytes = formOutputStream.toByteArray(); localVarRequestBuilder .header("Content-Type", entity.getContentType().getValue()) .method("POST", HttpRequest.BodyPublishers - .ofInputStream(() -> new ByteArrayInputStream(formOutputStream.toByteArray()))); + .ofInputStream(() -> new ByteArrayInputStream(formBytes))); if (memberVarReadTimeout != null) { localVarRequestBuilder.timeout(memberVarReadTimeout); } diff --git a/samples/client/echo_api/java/native/src/main/java/org/openapitools/client/api/HeaderApi.java b/samples/client/echo_api/java/native/src/main/java/org/openapitools/client/api/HeaderApi.java index bc301e35fd06..92eb9523b2df 100644 --- a/samples/client/echo_api/java/native/src/main/java/org/openapitools/client/api/HeaderApi.java +++ b/samples/client/echo_api/java/native/src/main/java/org/openapitools/client/api/HeaderApi.java @@ -80,7 +80,7 @@ public class HeaderApi { private final Consumer memberVarInterceptor; private final Duration memberVarReadTimeout; private final Consumer> memberVarResponseInterceptor; - private final Consumer> memberVarAsyncResponseInterceptor; + private final Consumer> memberVarAsyncResponseInterceptor; public HeaderApi() { this(Configuration.getDefaultApiClient()); @@ -98,7 +98,15 @@ public class HeaderApi { protected ApiException getApiException(String operationId, HttpResponse response) throws IOException { - String body = response.body() == null ? null : new String(response.body().readAllBytes()); + InputStream responseBody = ApiClient.getResponseBody(response); + String body = null; + try { + body = responseBody == null ? null : new String(responseBody.readAllBytes()); + } finally { + if (responseBody != null) { + responseBody.close(); + } + } String message = formatExceptionMessage(operationId, response.statusCode(), body); return new ApiException(response.statusCode(), message, response.headers(), body); } @@ -117,10 +125,13 @@ public class HeaderApi { * @return File * @throws ApiException If fail to read file content from response and write to disk */ - public File downloadFileFromResponse(HttpResponse response) throws ApiException { + public File downloadFileFromResponse(HttpResponse response, InputStream responseBody) throws ApiException { + if (responseBody == null) { + throw new ApiException(new IOException("Response body is empty")); + } try { File file = prepareDownloadFile(response); - java.nio.file.Files.copy(response.body(), file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); + java.nio.file.Files.copy(responseBody, file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); return file; } catch (IOException e) { throw new ApiException(e); @@ -226,6 +237,7 @@ public class HeaderApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testHeaderIntegerBooleanStringEnums", localVarResponse); @@ -233,7 +245,8 @@ public class HeaderApi { // for plain text response if (localVarResponse.headers().map().containsKey("Content-Type") && "text/plain".equalsIgnoreCase(localVarResponse.headers().map().get("Content-Type").get(0).split(";")[0].trim())) { - java.util.Scanner s = new java.util.Scanner(localVarResponse.body()).useDelimiter("\\A"); + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + java.util.Scanner s = new java.util.Scanner(localVarResponseBody == null ? InputStream.nullInputStream() : localVarResponseBody).useDelimiter("\\A"); String responseBodyText = s.hasNext() ? s.next() : ""; return new ApiResponse( localVarResponse.statusCode(), @@ -244,6 +257,9 @@ public class HeaderApi { throw new RuntimeException("Error! The response Content-Type is supposed to be `text/plain` but it's not: " + localVarResponse); } } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); diff --git a/samples/client/echo_api/java/native/src/main/java/org/openapitools/client/api/PathApi.java b/samples/client/echo_api/java/native/src/main/java/org/openapitools/client/api/PathApi.java index 0a01e3fa78f0..b462605735fd 100644 --- a/samples/client/echo_api/java/native/src/main/java/org/openapitools/client/api/PathApi.java +++ b/samples/client/echo_api/java/native/src/main/java/org/openapitools/client/api/PathApi.java @@ -80,7 +80,7 @@ public class PathApi { private final Consumer memberVarInterceptor; private final Duration memberVarReadTimeout; private final Consumer> memberVarResponseInterceptor; - private final Consumer> memberVarAsyncResponseInterceptor; + private final Consumer> memberVarAsyncResponseInterceptor; public PathApi() { this(Configuration.getDefaultApiClient()); @@ -98,7 +98,15 @@ public class PathApi { protected ApiException getApiException(String operationId, HttpResponse response) throws IOException { - String body = response.body() == null ? null : new String(response.body().readAllBytes()); + InputStream responseBody = ApiClient.getResponseBody(response); + String body = null; + try { + body = responseBody == null ? null : new String(responseBody.readAllBytes()); + } finally { + if (responseBody != null) { + responseBody.close(); + } + } String message = formatExceptionMessage(operationId, response.statusCode(), body); return new ApiException(response.statusCode(), message, response.headers(), body); } @@ -117,10 +125,13 @@ public class PathApi { * @return File * @throws ApiException If fail to read file content from response and write to disk */ - public File downloadFileFromResponse(HttpResponse response) throws ApiException { + public File downloadFileFromResponse(HttpResponse response, InputStream responseBody) throws ApiException { + if (responseBody == null) { + throw new ApiException(new IOException("Response body is empty")); + } try { File file = prepareDownloadFile(response); - java.nio.file.Files.copy(response.body(), file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); + java.nio.file.Files.copy(responseBody, file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); return file; } catch (IOException e) { throw new ApiException(e); @@ -222,6 +233,7 @@ public class PathApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPath", localVarResponse); @@ -229,7 +241,8 @@ public class PathApi { // for plain text response if (localVarResponse.headers().map().containsKey("Content-Type") && "text/plain".equalsIgnoreCase(localVarResponse.headers().map().get("Content-Type").get(0).split(";")[0].trim())) { - java.util.Scanner s = new java.util.Scanner(localVarResponse.body()).useDelimiter("\\A"); + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + java.util.Scanner s = new java.util.Scanner(localVarResponseBody == null ? InputStream.nullInputStream() : localVarResponseBody).useDelimiter("\\A"); String responseBodyText = s.hasNext() ? s.next() : ""; return new ApiResponse( localVarResponse.statusCode(), @@ -240,6 +253,9 @@ public class PathApi { throw new RuntimeException("Error! The response Content-Type is supposed to be `text/plain` but it's not: " + localVarResponse); } } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); diff --git a/samples/client/echo_api/java/native/src/main/java/org/openapitools/client/api/QueryApi.java b/samples/client/echo_api/java/native/src/main/java/org/openapitools/client/api/QueryApi.java index a04a4d6cdce6..bdaa4c94f52b 100644 --- a/samples/client/echo_api/java/native/src/main/java/org/openapitools/client/api/QueryApi.java +++ b/samples/client/echo_api/java/native/src/main/java/org/openapitools/client/api/QueryApi.java @@ -86,7 +86,7 @@ public class QueryApi { private final Consumer memberVarInterceptor; private final Duration memberVarReadTimeout; private final Consumer> memberVarResponseInterceptor; - private final Consumer> memberVarAsyncResponseInterceptor; + private final Consumer> memberVarAsyncResponseInterceptor; public QueryApi() { this(Configuration.getDefaultApiClient()); @@ -104,7 +104,15 @@ public class QueryApi { protected ApiException getApiException(String operationId, HttpResponse response) throws IOException { - String body = response.body() == null ? null : new String(response.body().readAllBytes()); + InputStream responseBody = ApiClient.getResponseBody(response); + String body = null; + try { + body = responseBody == null ? null : new String(responseBody.readAllBytes()); + } finally { + if (responseBody != null) { + responseBody.close(); + } + } String message = formatExceptionMessage(operationId, response.statusCode(), body); return new ApiException(response.statusCode(), message, response.headers(), body); } @@ -123,10 +131,13 @@ public class QueryApi { * @return File * @throws ApiException If fail to read file content from response and write to disk */ - public File downloadFileFromResponse(HttpResponse response) throws ApiException { + public File downloadFileFromResponse(HttpResponse response, InputStream responseBody) throws ApiException { + if (responseBody == null) { + throw new ApiException(new IOException("Response body is empty")); + } try { File file = prepareDownloadFile(response); - java.nio.file.Files.copy(response.body(), file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); + java.nio.file.Files.copy(responseBody, file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); return file; } catch (IOException e) { throw new ApiException(e); @@ -220,6 +231,7 @@ public class QueryApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testEnumRefString", localVarResponse); @@ -227,7 +239,8 @@ public class QueryApi { // for plain text response if (localVarResponse.headers().map().containsKey("Content-Type") && "text/plain".equalsIgnoreCase(localVarResponse.headers().map().get("Content-Type").get(0).split(";")[0].trim())) { - java.util.Scanner s = new java.util.Scanner(localVarResponse.body()).useDelimiter("\\A"); + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + java.util.Scanner s = new java.util.Scanner(localVarResponseBody == null ? InputStream.nullInputStream() : localVarResponseBody).useDelimiter("\\A"); String responseBodyText = s.hasNext() ? s.next() : ""; return new ApiResponse( localVarResponse.statusCode(), @@ -238,6 +251,9 @@ public class QueryApi { throw new RuntimeException("Error! The response Content-Type is supposed to be `text/plain` but it's not: " + localVarResponse); } } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -347,6 +363,7 @@ public class QueryApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testQueryDatetimeDateString", localVarResponse); @@ -354,7 +371,8 @@ public class QueryApi { // for plain text response if (localVarResponse.headers().map().containsKey("Content-Type") && "text/plain".equalsIgnoreCase(localVarResponse.headers().map().get("Content-Type").get(0).split(";")[0].trim())) { - java.util.Scanner s = new java.util.Scanner(localVarResponse.body()).useDelimiter("\\A"); + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + java.util.Scanner s = new java.util.Scanner(localVarResponseBody == null ? InputStream.nullInputStream() : localVarResponseBody).useDelimiter("\\A"); String responseBodyText = s.hasNext() ? s.next() : ""; return new ApiResponse( localVarResponse.statusCode(), @@ -365,6 +383,9 @@ public class QueryApi { throw new RuntimeException("Error! The response Content-Type is supposed to be `text/plain` but it's not: " + localVarResponse); } } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -476,6 +497,7 @@ public class QueryApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testQueryIntegerBooleanString", localVarResponse); @@ -483,7 +505,8 @@ public class QueryApi { // for plain text response if (localVarResponse.headers().map().containsKey("Content-Type") && "text/plain".equalsIgnoreCase(localVarResponse.headers().map().get("Content-Type").get(0).split(";")[0].trim())) { - java.util.Scanner s = new java.util.Scanner(localVarResponse.body()).useDelimiter("\\A"); + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + java.util.Scanner s = new java.util.Scanner(localVarResponseBody == null ? InputStream.nullInputStream() : localVarResponseBody).useDelimiter("\\A"); String responseBodyText = s.hasNext() ? s.next() : ""; return new ApiResponse( localVarResponse.statusCode(), @@ -494,6 +517,9 @@ public class QueryApi { throw new RuntimeException("Error! The response Content-Type is supposed to be `text/plain` but it's not: " + localVarResponse); } } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -597,6 +623,7 @@ public class QueryApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testQueryStyleDeepObjectExplodeTrueObject", localVarResponse); @@ -604,7 +631,8 @@ public class QueryApi { // for plain text response if (localVarResponse.headers().map().containsKey("Content-Type") && "text/plain".equalsIgnoreCase(localVarResponse.headers().map().get("Content-Type").get(0).split(";")[0].trim())) { - java.util.Scanner s = new java.util.Scanner(localVarResponse.body()).useDelimiter("\\A"); + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + java.util.Scanner s = new java.util.Scanner(localVarResponseBody == null ? InputStream.nullInputStream() : localVarResponseBody).useDelimiter("\\A"); String responseBodyText = s.hasNext() ? s.next() : ""; return new ApiResponse( localVarResponse.statusCode(), @@ -615,6 +643,9 @@ public class QueryApi { throw new RuntimeException("Error! The response Content-Type is supposed to be `text/plain` but it's not: " + localVarResponse); } } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -719,6 +750,7 @@ public class QueryApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testQueryStyleDeepObjectExplodeTrueObjectAllOf", localVarResponse); @@ -726,7 +758,8 @@ public class QueryApi { // for plain text response if (localVarResponse.headers().map().containsKey("Content-Type") && "text/plain".equalsIgnoreCase(localVarResponse.headers().map().get("Content-Type").get(0).split(";")[0].trim())) { - java.util.Scanner s = new java.util.Scanner(localVarResponse.body()).useDelimiter("\\A"); + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + java.util.Scanner s = new java.util.Scanner(localVarResponseBody == null ? InputStream.nullInputStream() : localVarResponseBody).useDelimiter("\\A"); String responseBodyText = s.hasNext() ? s.next() : ""; return new ApiResponse( localVarResponse.statusCode(), @@ -737,6 +770,9 @@ public class QueryApi { throw new RuntimeException("Error! The response Content-Type is supposed to be `text/plain` but it's not: " + localVarResponse); } } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -841,6 +877,7 @@ public class QueryApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testQueryStyleFormExplodeFalseArrayInteger", localVarResponse); @@ -848,7 +885,8 @@ public class QueryApi { // for plain text response if (localVarResponse.headers().map().containsKey("Content-Type") && "text/plain".equalsIgnoreCase(localVarResponse.headers().map().get("Content-Type").get(0).split(";")[0].trim())) { - java.util.Scanner s = new java.util.Scanner(localVarResponse.body()).useDelimiter("\\A"); + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + java.util.Scanner s = new java.util.Scanner(localVarResponseBody == null ? InputStream.nullInputStream() : localVarResponseBody).useDelimiter("\\A"); String responseBodyText = s.hasNext() ? s.next() : ""; return new ApiResponse( localVarResponse.statusCode(), @@ -859,6 +897,9 @@ public class QueryApi { throw new RuntimeException("Error! The response Content-Type is supposed to be `text/plain` but it's not: " + localVarResponse); } } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -958,6 +999,7 @@ public class QueryApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testQueryStyleFormExplodeFalseArrayString", localVarResponse); @@ -965,7 +1007,8 @@ public class QueryApi { // for plain text response if (localVarResponse.headers().map().containsKey("Content-Type") && "text/plain".equalsIgnoreCase(localVarResponse.headers().map().get("Content-Type").get(0).split(";")[0].trim())) { - java.util.Scanner s = new java.util.Scanner(localVarResponse.body()).useDelimiter("\\A"); + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + java.util.Scanner s = new java.util.Scanner(localVarResponseBody == null ? InputStream.nullInputStream() : localVarResponseBody).useDelimiter("\\A"); String responseBodyText = s.hasNext() ? s.next() : ""; return new ApiResponse( localVarResponse.statusCode(), @@ -976,6 +1019,9 @@ public class QueryApi { throw new RuntimeException("Error! The response Content-Type is supposed to be `text/plain` but it's not: " + localVarResponse); } } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -1075,6 +1121,7 @@ public class QueryApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testQueryStyleFormExplodeTrueArrayString", localVarResponse); @@ -1082,7 +1129,8 @@ public class QueryApi { // for plain text response if (localVarResponse.headers().map().containsKey("Content-Type") && "text/plain".equalsIgnoreCase(localVarResponse.headers().map().get("Content-Type").get(0).split(";")[0].trim())) { - java.util.Scanner s = new java.util.Scanner(localVarResponse.body()).useDelimiter("\\A"); + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + java.util.Scanner s = new java.util.Scanner(localVarResponseBody == null ? InputStream.nullInputStream() : localVarResponseBody).useDelimiter("\\A"); String responseBodyText = s.hasNext() ? s.next() : ""; return new ApiResponse( localVarResponse.statusCode(), @@ -1093,6 +1141,9 @@ public class QueryApi { throw new RuntimeException("Error! The response Content-Type is supposed to be `text/plain` but it's not: " + localVarResponse); } } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -1192,6 +1243,7 @@ public class QueryApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testQueryStyleFormExplodeTrueObject", localVarResponse); @@ -1199,7 +1251,8 @@ public class QueryApi { // for plain text response if (localVarResponse.headers().map().containsKey("Content-Type") && "text/plain".equalsIgnoreCase(localVarResponse.headers().map().get("Content-Type").get(0).split(";")[0].trim())) { - java.util.Scanner s = new java.util.Scanner(localVarResponse.body()).useDelimiter("\\A"); + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + java.util.Scanner s = new java.util.Scanner(localVarResponseBody == null ? InputStream.nullInputStream() : localVarResponseBody).useDelimiter("\\A"); String responseBodyText = s.hasNext() ? s.next() : ""; return new ApiResponse( localVarResponse.statusCode(), @@ -1210,6 +1263,9 @@ public class QueryApi { throw new RuntimeException("Error! The response Content-Type is supposed to be `text/plain` but it's not: " + localVarResponse); } } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -1314,6 +1370,7 @@ public class QueryApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testQueryStyleFormExplodeTrueObjectAllOf", localVarResponse); @@ -1321,7 +1378,8 @@ public class QueryApi { // for plain text response if (localVarResponse.headers().map().containsKey("Content-Type") && "text/plain".equalsIgnoreCase(localVarResponse.headers().map().get("Content-Type").get(0).split(";")[0].trim())) { - java.util.Scanner s = new java.util.Scanner(localVarResponse.body()).useDelimiter("\\A"); + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + java.util.Scanner s = new java.util.Scanner(localVarResponseBody == null ? InputStream.nullInputStream() : localVarResponseBody).useDelimiter("\\A"); String responseBodyText = s.hasNext() ? s.next() : ""; return new ApiResponse( localVarResponse.statusCode(), @@ -1332,6 +1390,9 @@ public class QueryApi { throw new RuntimeException("Error! The response Content-Type is supposed to be `text/plain` but it's not: " + localVarResponse); } } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -1435,6 +1496,7 @@ public class QueryApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testQueryStyleJsonSerializationObject", localVarResponse); @@ -1442,7 +1504,8 @@ public class QueryApi { // for plain text response if (localVarResponse.headers().map().containsKey("Content-Type") && "text/plain".equalsIgnoreCase(localVarResponse.headers().map().get("Content-Type").get(0).split(";")[0].trim())) { - java.util.Scanner s = new java.util.Scanner(localVarResponse.body()).useDelimiter("\\A"); + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + java.util.Scanner s = new java.util.Scanner(localVarResponseBody == null ? InputStream.nullInputStream() : localVarResponseBody).useDelimiter("\\A"); String responseBodyText = s.hasNext() ? s.next() : ""; return new ApiResponse( localVarResponse.statusCode(), @@ -1453,6 +1516,9 @@ public class QueryApi { throw new RuntimeException("Error! The response Content-Type is supposed to be `text/plain` but it's not: " + localVarResponse); } } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); diff --git a/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/ApiClient.java b/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/ApiClient.java index 0caa87e1ea19..3f503b919cc4 100644 --- a/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/ApiClient.java +++ b/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/ApiClient.java @@ -20,6 +20,7 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import org.openapitools.jackson.nullable.JsonNullableModule; import java.io.InputStream; +import java.io.IOException; import java.net.URI; import java.net.URLEncoder; import java.net.http.HttpClient; @@ -34,6 +35,8 @@ import java.util.Collections; import java.util.List; import java.util.StringJoiner; import java.util.function.Consumer; +import java.util.Optional; +import java.util.zip.GZIPInputStream; import java.util.stream.Collectors; import static java.nio.charset.StandardCharsets.UTF_8; @@ -62,7 +65,7 @@ public class ApiClient { protected String basePath; protected Consumer interceptor; protected Consumer> responseInterceptor; - protected Consumer> asyncResponseInterceptor; + protected Consumer> asyncResponseInterceptor; protected Duration readTimeout; protected Duration connectTimeout; @@ -384,7 +387,7 @@ public class ApiClient { * of null resets the interceptor to a no-op. * @return This object. */ - public ApiClient setAsyncResponseInterceptor(Consumer> interceptor) { + public ApiClient setAsyncResponseInterceptor(Consumer> interceptor) { this.asyncResponseInterceptor = interceptor; return this; } @@ -394,7 +397,7 @@ public class ApiClient { * * @return The custom interceptor that was set, or null if there isn't any. */ - public Consumer> getAsyncResponseInterceptor() { + public Consumer> getAsyncResponseInterceptor() { return asyncResponseInterceptor; } @@ -454,4 +457,32 @@ public class ApiClient { public Duration getConnectTimeout() { return connectTimeout; } + + /** + * Returns the response body InputStream, transparently decoding gzip-compressed + * payloads when the server sets {@code Content-Encoding: gzip}. + * + * @param response HTTP response whose body should be consumed + * @return Original or decompressed InputStream for the response body + * @throws IOException if the response body cannot be accessed or wrapping fails + */ + public static InputStream getResponseBody(HttpResponse response) throws IOException { + if (response == null) { + return null; + } + InputStream body = response.body(); + if (body == null) { + return null; + } + Optional encoding = response.headers().firstValue("Content-Encoding"); + if (encoding.isPresent()) { + for (String token : encoding.get().split(",")) { + if ("gzip".equalsIgnoreCase(token.trim())) { + return new GZIPInputStream(body); + } + } + } + return body; + } + } diff --git a/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/api/AnotherFakeApi.java b/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/api/AnotherFakeApi.java index f748e1a49ba1..2ee4a0b7a141 100644 --- a/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/api/AnotherFakeApi.java +++ b/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/api/AnotherFakeApi.java @@ -76,7 +76,7 @@ public class AnotherFakeApi { private final Consumer memberVarInterceptor; private final Duration memberVarReadTimeout; private final Consumer> memberVarResponseInterceptor; - private final Consumer> memberVarAsyncResponseInterceptor; + private final Consumer> memberVarAsyncResponseInterceptor; public AnotherFakeApi() { this(Configuration.getDefaultApiClient()); @@ -93,9 +93,19 @@ public class AnotherFakeApi { } - private ApiException getApiException(String operationId, HttpResponse response) { - String message = formatExceptionMessage(operationId, response.statusCode(), response.body()); - return new ApiException(response.statusCode(), message, response.headers(), response.body()); + private ApiException getApiException(String operationId, HttpResponse response) { + try { + InputStream responseBody = ApiClient.getResponseBody(response); + String body = null; + if (responseBody != null) { + body = new String(responseBody.readAllBytes()); + responseBody.close(); + } + String message = formatExceptionMessage(operationId, response.statusCode(), body); + return new ApiException(response.statusCode(), message, response.headers(), body); + } catch (IOException e) { + return new ApiException(e); + } } private String formatExceptionMessage(String operationId, int statusCode, String body) { @@ -112,10 +122,13 @@ public class AnotherFakeApi { * @return File * @throws ApiException If fail to read file content from response and write to disk */ - public File downloadFileFromResponse(HttpResponse response) throws ApiException { + public File downloadFileFromResponse(HttpResponse response, InputStream responseBody) throws ApiException { + if (responseBody == null) { + throw new ApiException(new IOException("Response body is empty")); + } try { File file = prepareDownloadFile(response); - java.nio.file.Files.copy(response.body(), file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); + java.nio.file.Files.copy(responseBody, file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); return file; } catch (IOException e) { throw new ApiException(e); @@ -174,22 +187,8 @@ public class AnotherFakeApi { */ public CompletableFuture call123testSpecialTags(@javax.annotation.Nonnull Client client, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = call123testSpecialTagsRequestBuilder(client, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("call123testSpecialTags", localVarResponse)); - } - try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference() {}) - ); - } catch (IOException e) { - return CompletableFuture.failedFuture(new ApiException(e)); - } - }); + return call123testSpecialTagsWithHttpInfo(client, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -220,7 +219,7 @@ public class AnotherFakeApi { HttpRequest.Builder localVarRequestBuilder = call123testSpecialTagsRequestBuilder(client, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } @@ -228,13 +227,34 @@ public class AnotherFakeApi { return CompletableFuture.failedFuture(getApiException("call123testSpecialTags", localVarResponse)); } try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - new ApiResponse( - localVarResponse.statusCode(), - localVarResponse.headers().map(), - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference() {})) - ); + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody == null) { + return CompletableFuture.completedFuture( + new ApiResponse( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + null + ) + ); + } + + + String responseBody = new String(localVarResponseBody.readAllBytes()); + Client responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); + + return CompletableFuture.completedFuture( + new ApiResponse( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + responseValue + ) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } } catch (IOException e) { return CompletableFuture.failedFuture(new ApiException(e)); } diff --git a/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/api/DefaultApi.java b/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/api/DefaultApi.java index 02fa021b863c..034ac23ffe17 100644 --- a/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/api/DefaultApi.java +++ b/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/api/DefaultApi.java @@ -76,7 +76,7 @@ public class DefaultApi { private final Consumer memberVarInterceptor; private final Duration memberVarReadTimeout; private final Consumer> memberVarResponseInterceptor; - private final Consumer> memberVarAsyncResponseInterceptor; + private final Consumer> memberVarAsyncResponseInterceptor; public DefaultApi() { this(Configuration.getDefaultApiClient()); @@ -93,9 +93,19 @@ public class DefaultApi { } - private ApiException getApiException(String operationId, HttpResponse response) { - String message = formatExceptionMessage(operationId, response.statusCode(), response.body()); - return new ApiException(response.statusCode(), message, response.headers(), response.body()); + private ApiException getApiException(String operationId, HttpResponse response) { + try { + InputStream responseBody = ApiClient.getResponseBody(response); + String body = null; + if (responseBody != null) { + body = new String(responseBody.readAllBytes()); + responseBody.close(); + } + String message = formatExceptionMessage(operationId, response.statusCode(), body); + return new ApiException(response.statusCode(), message, response.headers(), body); + } catch (IOException e) { + return new ApiException(e); + } } private String formatExceptionMessage(String operationId, int statusCode, String body) { @@ -112,10 +122,13 @@ public class DefaultApi { * @return File * @throws ApiException If fail to read file content from response and write to disk */ - public File downloadFileFromResponse(HttpResponse response) throws ApiException { + public File downloadFileFromResponse(HttpResponse response, InputStream responseBody) throws ApiException { + if (responseBody == null) { + throw new ApiException(new IOException("Response body is empty")); + } try { File file = prepareDownloadFile(response); - java.nio.file.Files.copy(response.body(), file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); + java.nio.file.Files.copy(responseBody, file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); return file; } catch (IOException e) { throw new ApiException(e); @@ -172,22 +185,8 @@ public class DefaultApi { */ public CompletableFuture fooGet(Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = fooGetRequestBuilder(headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("fooGet", localVarResponse)); - } - try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference() {}) - ); - } catch (IOException e) { - return CompletableFuture.failedFuture(new ApiException(e)); - } - }); + return fooGetWithHttpInfo(headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -216,7 +215,7 @@ public class DefaultApi { HttpRequest.Builder localVarRequestBuilder = fooGetRequestBuilder(headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } @@ -224,13 +223,34 @@ public class DefaultApi { return CompletableFuture.failedFuture(getApiException("fooGet", localVarResponse)); } try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - new ApiResponse( - localVarResponse.statusCode(), - localVarResponse.headers().map(), - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference() {})) - ); + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody == null) { + return CompletableFuture.completedFuture( + new ApiResponse( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + null + ) + ); + } + + + String responseBody = new String(localVarResponseBody.readAllBytes()); + FooGetDefaultResponse responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); + + return CompletableFuture.completedFuture( + new ApiResponse( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + responseValue + ) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } } catch (IOException e) { return CompletableFuture.failedFuture(new ApiException(e)); } diff --git a/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/api/FakeApi.java b/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/api/FakeApi.java index e446960b8c67..f8bf6ea550ef 100644 --- a/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/api/FakeApi.java +++ b/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/api/FakeApi.java @@ -93,7 +93,7 @@ public class FakeApi { private final Consumer memberVarInterceptor; private final Duration memberVarReadTimeout; private final Consumer> memberVarResponseInterceptor; - private final Consumer> memberVarAsyncResponseInterceptor; + private final Consumer> memberVarAsyncResponseInterceptor; public FakeApi() { this(Configuration.getDefaultApiClient()); @@ -110,9 +110,19 @@ public class FakeApi { } - private ApiException getApiException(String operationId, HttpResponse response) { - String message = formatExceptionMessage(operationId, response.statusCode(), response.body()); - return new ApiException(response.statusCode(), message, response.headers(), response.body()); + private ApiException getApiException(String operationId, HttpResponse response) { + try { + InputStream responseBody = ApiClient.getResponseBody(response); + String body = null; + if (responseBody != null) { + body = new String(responseBody.readAllBytes()); + responseBody.close(); + } + String message = formatExceptionMessage(operationId, response.statusCode(), body); + return new ApiException(response.statusCode(), message, response.headers(), body); + } catch (IOException e) { + return new ApiException(e); + } } private String formatExceptionMessage(String operationId, int statusCode, String body) { @@ -129,10 +139,13 @@ public class FakeApi { * @return File * @throws ApiException If fail to read file content from response and write to disk */ - public File downloadFileFromResponse(HttpResponse response) throws ApiException { + public File downloadFileFromResponse(HttpResponse response, InputStream responseBody) throws ApiException { + if (responseBody == null) { + throw new ApiException(new IOException("Response body is empty")); + } try { File file = prepareDownloadFile(response); - java.nio.file.Files.copy(response.body(), file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); + java.nio.file.Files.copy(responseBody, file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); return file; } catch (IOException e) { throw new ApiException(e); @@ -189,22 +202,8 @@ public class FakeApi { */ public CompletableFuture fakeBigDecimalMap(Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = fakeBigDecimalMapRequestBuilder(headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("fakeBigDecimalMap", localVarResponse)); - } - try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference() {}) - ); - } catch (IOException e) { - return CompletableFuture.failedFuture(new ApiException(e)); - } - }); + return fakeBigDecimalMapWithHttpInfo(headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -233,7 +232,7 @@ public class FakeApi { HttpRequest.Builder localVarRequestBuilder = fakeBigDecimalMapRequestBuilder(headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } @@ -241,13 +240,34 @@ public class FakeApi { return CompletableFuture.failedFuture(getApiException("fakeBigDecimalMap", localVarResponse)); } try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - new ApiResponse( - localVarResponse.statusCode(), - localVarResponse.headers().map(), - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference() {})) - ); + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody == null) { + return CompletableFuture.completedFuture( + new ApiResponse( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + null + ) + ); + } + + + String responseBody = new String(localVarResponseBody.readAllBytes()); + FakeBigDecimalMap200Response responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); + + return CompletableFuture.completedFuture( + new ApiResponse( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + responseValue + ) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } } catch (IOException e) { return CompletableFuture.failedFuture(new ApiException(e)); } @@ -300,22 +320,8 @@ public class FakeApi { */ public CompletableFuture fakeHealthGet(Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = fakeHealthGetRequestBuilder(headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("fakeHealthGet", localVarResponse)); - } - try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference() {}) - ); - } catch (IOException e) { - return CompletableFuture.failedFuture(new ApiException(e)); - } - }); + return fakeHealthGetWithHttpInfo(headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -344,7 +350,7 @@ public class FakeApi { HttpRequest.Builder localVarRequestBuilder = fakeHealthGetRequestBuilder(headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } @@ -352,13 +358,34 @@ public class FakeApi { return CompletableFuture.failedFuture(getApiException("fakeHealthGet", localVarResponse)); } try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - new ApiResponse( - localVarResponse.statusCode(), - localVarResponse.headers().map(), - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference() {})) - ); + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody == null) { + return CompletableFuture.completedFuture( + new ApiResponse( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + null + ) + ); + } + + + String responseBody = new String(localVarResponseBody.readAllBytes()); + HealthCheckResult responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); + + return CompletableFuture.completedFuture( + new ApiResponse( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + responseValue + ) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } } catch (IOException e) { return CompletableFuture.failedFuture(new ApiException(e)); } @@ -413,22 +440,8 @@ public class FakeApi { */ public CompletableFuture fakeOuterBooleanSerialize(@javax.annotation.Nullable Boolean body, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = fakeOuterBooleanSerializeRequestBuilder(body, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("fakeOuterBooleanSerialize", localVarResponse)); - } - try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference() {}) - ); - } catch (IOException e) { - return CompletableFuture.failedFuture(new ApiException(e)); - } - }); + return fakeOuterBooleanSerializeWithHttpInfo(body, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -459,7 +472,7 @@ public class FakeApi { HttpRequest.Builder localVarRequestBuilder = fakeOuterBooleanSerializeRequestBuilder(body, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } @@ -467,13 +480,34 @@ public class FakeApi { return CompletableFuture.failedFuture(getApiException("fakeOuterBooleanSerialize", localVarResponse)); } try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - new ApiResponse( - localVarResponse.statusCode(), - localVarResponse.headers().map(), - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference() {})) - ); + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody == null) { + return CompletableFuture.completedFuture( + new ApiResponse( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + null + ) + ); + } + + + String responseBody = new String(localVarResponseBody.readAllBytes()); + Boolean responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); + + return CompletableFuture.completedFuture( + new ApiResponse( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + responseValue + ) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } } catch (IOException e) { return CompletableFuture.failedFuture(new ApiException(e)); } @@ -534,22 +568,8 @@ public class FakeApi { */ public CompletableFuture fakeOuterCompositeSerialize(@javax.annotation.Nullable OuterComposite outerComposite, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = fakeOuterCompositeSerializeRequestBuilder(outerComposite, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("fakeOuterCompositeSerialize", localVarResponse)); - } - try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference() {}) - ); - } catch (IOException e) { - return CompletableFuture.failedFuture(new ApiException(e)); - } - }); + return fakeOuterCompositeSerializeWithHttpInfo(outerComposite, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -580,7 +600,7 @@ public class FakeApi { HttpRequest.Builder localVarRequestBuilder = fakeOuterCompositeSerializeRequestBuilder(outerComposite, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } @@ -588,13 +608,34 @@ public class FakeApi { return CompletableFuture.failedFuture(getApiException("fakeOuterCompositeSerialize", localVarResponse)); } try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - new ApiResponse( - localVarResponse.statusCode(), - localVarResponse.headers().map(), - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference() {})) - ); + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody == null) { + return CompletableFuture.completedFuture( + new ApiResponse( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + null + ) + ); + } + + + String responseBody = new String(localVarResponseBody.readAllBytes()); + OuterComposite responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); + + return CompletableFuture.completedFuture( + new ApiResponse( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + responseValue + ) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } } catch (IOException e) { return CompletableFuture.failedFuture(new ApiException(e)); } @@ -655,22 +696,8 @@ public class FakeApi { */ public CompletableFuture fakeOuterNumberSerialize(@javax.annotation.Nullable BigDecimal body, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = fakeOuterNumberSerializeRequestBuilder(body, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("fakeOuterNumberSerialize", localVarResponse)); - } - try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference() {}) - ); - } catch (IOException e) { - return CompletableFuture.failedFuture(new ApiException(e)); - } - }); + return fakeOuterNumberSerializeWithHttpInfo(body, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -701,7 +728,7 @@ public class FakeApi { HttpRequest.Builder localVarRequestBuilder = fakeOuterNumberSerializeRequestBuilder(body, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } @@ -709,13 +736,34 @@ public class FakeApi { return CompletableFuture.failedFuture(getApiException("fakeOuterNumberSerialize", localVarResponse)); } try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - new ApiResponse( - localVarResponse.statusCode(), - localVarResponse.headers().map(), - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference() {})) - ); + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody == null) { + return CompletableFuture.completedFuture( + new ApiResponse( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + null + ) + ); + } + + + String responseBody = new String(localVarResponseBody.readAllBytes()); + BigDecimal responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); + + return CompletableFuture.completedFuture( + new ApiResponse( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + responseValue + ) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } } catch (IOException e) { return CompletableFuture.failedFuture(new ApiException(e)); } @@ -776,22 +824,8 @@ public class FakeApi { */ public CompletableFuture fakeOuterStringSerialize(@javax.annotation.Nullable String body, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = fakeOuterStringSerializeRequestBuilder(body, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("fakeOuterStringSerialize", localVarResponse)); - } - try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference() {}) - ); - } catch (IOException e) { - return CompletableFuture.failedFuture(new ApiException(e)); - } - }); + return fakeOuterStringSerializeWithHttpInfo(body, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -822,7 +856,7 @@ public class FakeApi { HttpRequest.Builder localVarRequestBuilder = fakeOuterStringSerializeRequestBuilder(body, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } @@ -830,13 +864,34 @@ public class FakeApi { return CompletableFuture.failedFuture(getApiException("fakeOuterStringSerialize", localVarResponse)); } try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - new ApiResponse( - localVarResponse.statusCode(), - localVarResponse.headers().map(), - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference() {})) - ); + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody == null) { + return CompletableFuture.completedFuture( + new ApiResponse( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + null + ) + ); + } + + + String responseBody = new String(localVarResponseBody.readAllBytes()); + String responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); + + return CompletableFuture.completedFuture( + new ApiResponse( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + responseValue + ) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } } catch (IOException e) { return CompletableFuture.failedFuture(new ApiException(e)); } @@ -890,22 +945,8 @@ public class FakeApi { */ public CompletableFuture> getApplicationJsonUtf8(Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = getApplicationJsonUtf8RequestBuilder(headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("getApplicationJsonUtf8", localVarResponse)); - } - try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference>() {}) - ); - } catch (IOException e) { - return CompletableFuture.failedFuture(new ApiException(e)); - } - }); + return getApplicationJsonUtf8WithHttpInfo(headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -934,7 +975,7 @@ public class FakeApi { HttpRequest.Builder localVarRequestBuilder = getApplicationJsonUtf8RequestBuilder(headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } @@ -942,13 +983,34 @@ public class FakeApi { return CompletableFuture.failedFuture(getApiException("getApplicationJsonUtf8", localVarResponse)); } try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - new ApiResponse>( - localVarResponse.statusCode(), - localVarResponse.headers().map(), - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference>() {})) - ); + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody == null) { + return CompletableFuture.completedFuture( + new ApiResponse>( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + null + ) + ); + } + + + String responseBody = new String(localVarResponseBody.readAllBytes()); + List responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference>() {}); + + return CompletableFuture.completedFuture( + new ApiResponse>( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + responseValue + ) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } } catch (IOException e) { return CompletableFuture.failedFuture(new ApiException(e)); } @@ -1001,22 +1063,8 @@ public class FakeApi { */ public CompletableFuture> getArrayOfEnums(Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = getArrayOfEnumsRequestBuilder(headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("getArrayOfEnums", localVarResponse)); - } - try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference>() {}) - ); - } catch (IOException e) { - return CompletableFuture.failedFuture(new ApiException(e)); - } - }); + return getArrayOfEnumsWithHttpInfo(headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -1045,7 +1093,7 @@ public class FakeApi { HttpRequest.Builder localVarRequestBuilder = getArrayOfEnumsRequestBuilder(headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } @@ -1053,13 +1101,34 @@ public class FakeApi { return CompletableFuture.failedFuture(getApiException("getArrayOfEnums", localVarResponse)); } try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - new ApiResponse>( - localVarResponse.statusCode(), - localVarResponse.headers().map(), - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference>() {})) - ); + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody == null) { + return CompletableFuture.completedFuture( + new ApiResponse>( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + null + ) + ); + } + + + String responseBody = new String(localVarResponseBody.readAllBytes()); + List responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference>() {}); + + return CompletableFuture.completedFuture( + new ApiResponse>( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + responseValue + ) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } } catch (IOException e) { return CompletableFuture.failedFuture(new ApiException(e)); } @@ -1114,15 +1183,8 @@ public class FakeApi { */ public CompletableFuture testAdditionalPropertiesReference(@javax.annotation.Nonnull Map requestBody, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = testAdditionalPropertiesReferenceRequestBuilder(requestBody, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("testAdditionalPropertiesReference", localVarResponse)); - } - return CompletableFuture.completedFuture(null); - }); + return testAdditionalPropertiesReferenceWithHttpInfo(requestBody, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -1153,16 +1215,30 @@ public class FakeApi { HttpRequest.Builder localVarRequestBuilder = testAdditionalPropertiesReferenceRequestBuilder(requestBody, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } if (localVarResponse.statusCode()/ 100 != 2) { return CompletableFuture.failedFuture(getApiException("testAdditionalPropertiesReference", localVarResponse)); } - return CompletableFuture.completedFuture( - new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) - ); + try { + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } + return CompletableFuture.completedFuture( + new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } + } catch (IOException e) { + return CompletableFuture.failedFuture(new ApiException(e)); + } } ); } @@ -1224,15 +1300,8 @@ public class FakeApi { */ public CompletableFuture testBodyWithFileSchema(@javax.annotation.Nonnull FileSchemaTestClass fileSchemaTestClass, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = testBodyWithFileSchemaRequestBuilder(fileSchemaTestClass, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("testBodyWithFileSchema", localVarResponse)); - } - return CompletableFuture.completedFuture(null); - }); + return testBodyWithFileSchemaWithHttpInfo(fileSchemaTestClass, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -1263,16 +1332,30 @@ public class FakeApi { HttpRequest.Builder localVarRequestBuilder = testBodyWithFileSchemaRequestBuilder(fileSchemaTestClass, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } if (localVarResponse.statusCode()/ 100 != 2) { return CompletableFuture.failedFuture(getApiException("testBodyWithFileSchema", localVarResponse)); } - return CompletableFuture.completedFuture( - new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) - ); + try { + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } + return CompletableFuture.completedFuture( + new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } + } catch (IOException e) { + return CompletableFuture.failedFuture(new ApiException(e)); + } } ); } @@ -1336,15 +1419,8 @@ public class FakeApi { */ public CompletableFuture testBodyWithQueryParams(@javax.annotation.Nonnull String query, @javax.annotation.Nonnull User user, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = testBodyWithQueryParamsRequestBuilder(query, user, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("testBodyWithQueryParams", localVarResponse)); - } - return CompletableFuture.completedFuture(null); - }); + return testBodyWithQueryParamsWithHttpInfo(query, user, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -1377,16 +1453,30 @@ public class FakeApi { HttpRequest.Builder localVarRequestBuilder = testBodyWithQueryParamsRequestBuilder(query, user, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } if (localVarResponse.statusCode()/ 100 != 2) { return CompletableFuture.failedFuture(getApiException("testBodyWithQueryParams", localVarResponse)); } - return CompletableFuture.completedFuture( - new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) - ); + try { + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } + return CompletableFuture.completedFuture( + new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } + } catch (IOException e) { + return CompletableFuture.failedFuture(new ApiException(e)); + } } ); } @@ -1467,22 +1557,8 @@ public class FakeApi { */ public CompletableFuture testClientModel(@javax.annotation.Nonnull Client client, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = testClientModelRequestBuilder(client, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("testClientModel", localVarResponse)); - } - try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference() {}) - ); - } catch (IOException e) { - return CompletableFuture.failedFuture(new ApiException(e)); - } - }); + return testClientModelWithHttpInfo(client, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -1513,7 +1589,7 @@ public class FakeApi { HttpRequest.Builder localVarRequestBuilder = testClientModelRequestBuilder(client, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } @@ -1521,13 +1597,34 @@ public class FakeApi { return CompletableFuture.failedFuture(getApiException("testClientModel", localVarResponse)); } try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - new ApiResponse( - localVarResponse.statusCode(), - localVarResponse.headers().map(), - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference() {})) - ); + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody == null) { + return CompletableFuture.completedFuture( + new ApiResponse( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + null + ) + ); + } + + + String responseBody = new String(localVarResponseBody.readAllBytes()); + Client responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); + + return CompletableFuture.completedFuture( + new ApiResponse( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + responseValue + ) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } } catch (IOException e) { return CompletableFuture.failedFuture(new ApiException(e)); } @@ -1618,15 +1715,8 @@ public class FakeApi { */ public CompletableFuture testEndpointParameters(@javax.annotation.Nonnull BigDecimal number, @javax.annotation.Nonnull Double _double, @javax.annotation.Nonnull String patternWithoutDelimiter, @javax.annotation.Nonnull byte[] _byte, @javax.annotation.Nullable Integer integer, @javax.annotation.Nullable Integer int32, @javax.annotation.Nullable Long int64, @javax.annotation.Nullable Float _float, @javax.annotation.Nullable String string, @javax.annotation.Nullable File binary, @javax.annotation.Nullable LocalDate date, @javax.annotation.Nullable OffsetDateTime dateTime, @javax.annotation.Nullable String password, @javax.annotation.Nullable String paramCallback, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = testEndpointParametersRequestBuilder(number, _double, patternWithoutDelimiter, _byte, integer, int32, int64, _float, string, binary, date, dateTime, password, paramCallback, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("testEndpointParameters", localVarResponse)); - } - return CompletableFuture.completedFuture(null); - }); + return testEndpointParametersWithHttpInfo(number, _double, patternWithoutDelimiter, _byte, integer, int32, int64, _float, string, binary, date, dateTime, password, paramCallback, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -1683,16 +1773,30 @@ public class FakeApi { HttpRequest.Builder localVarRequestBuilder = testEndpointParametersRequestBuilder(number, _double, patternWithoutDelimiter, _byte, integer, int32, int64, _float, string, binary, date, dateTime, password, paramCallback, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } if (localVarResponse.statusCode()/ 100 != 2) { return CompletableFuture.failedFuture(getApiException("testEndpointParameters", localVarResponse)); } - return CompletableFuture.completedFuture( - new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) - ); + try { + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } + return CompletableFuture.completedFuture( + new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } + } catch (IOException e) { + return CompletableFuture.failedFuture(new ApiException(e)); + } } ); } @@ -1777,10 +1881,11 @@ public class FakeApi { } catch (IOException e) { throw new RuntimeException(e); } + byte[] formBytes = formOutputStream.toByteArray(); localVarRequestBuilder .header("Content-Type", entity.getContentType().getValue()) .method("POST", HttpRequest.BodyPublishers - .ofInputStream(() -> new ByteArrayInputStream(formOutputStream.toByteArray()))); + .ofInputStream(() -> new ByteArrayInputStream(formBytes))); if (memberVarReadTimeout != null) { localVarRequestBuilder.timeout(memberVarReadTimeout); } @@ -1827,15 +1932,8 @@ public class FakeApi { */ public CompletableFuture testEnumParameters(@javax.annotation.Nullable List enumHeaderStringArray, @javax.annotation.Nullable String enumHeaderString, @javax.annotation.Nullable List enumQueryStringArray, @javax.annotation.Nullable String enumQueryString, @javax.annotation.Nullable Integer enumQueryInteger, @javax.annotation.Nullable Double enumQueryDouble, @javax.annotation.Nullable List enumFormStringArray, @javax.annotation.Nullable String enumFormString, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = testEnumParametersRequestBuilder(enumHeaderStringArray, enumHeaderString, enumQueryStringArray, enumQueryString, enumQueryInteger, enumQueryDouble, enumFormStringArray, enumFormString, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("testEnumParameters", localVarResponse)); - } - return CompletableFuture.completedFuture(null); - }); + return testEnumParametersWithHttpInfo(enumHeaderStringArray, enumHeaderString, enumQueryStringArray, enumQueryString, enumQueryInteger, enumQueryDouble, enumFormStringArray, enumFormString, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -1880,16 +1978,30 @@ public class FakeApi { HttpRequest.Builder localVarRequestBuilder = testEnumParametersRequestBuilder(enumHeaderStringArray, enumHeaderString, enumQueryStringArray, enumQueryString, enumQueryInteger, enumQueryDouble, enumFormStringArray, enumFormString, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } if (localVarResponse.statusCode()/ 100 != 2) { return CompletableFuture.failedFuture(getApiException("testEnumParameters", localVarResponse)); } - return CompletableFuture.completedFuture( - new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) - ); + try { + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } + return CompletableFuture.completedFuture( + new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } + } catch (IOException e) { + return CompletableFuture.failedFuture(new ApiException(e)); + } } ); } @@ -1951,10 +2063,11 @@ public class FakeApi { } catch (IOException e) { throw new RuntimeException(e); } + byte[] formBytes = formOutputStream.toByteArray(); localVarRequestBuilder .header("Content-Type", entity.getContentType().getValue()) .method("GET", HttpRequest.BodyPublishers - .ofInputStream(() -> new ByteArrayInputStream(formOutputStream.toByteArray()))); + .ofInputStream(() -> new ByteArrayInputStream(formBytes))); if (memberVarReadTimeout != null) { localVarRequestBuilder.timeout(memberVarReadTimeout); } @@ -2061,15 +2174,8 @@ public class FakeApi { */ public CompletableFuture testGroupParameters(@javax.annotation.Nonnull Integer requiredStringGroup, @javax.annotation.Nonnull Boolean requiredBooleanGroup, @javax.annotation.Nonnull Long requiredInt64Group, @javax.annotation.Nullable Integer stringGroup, @javax.annotation.Nullable Boolean booleanGroup, @javax.annotation.Nullable Long int64Group, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = testGroupParametersRequestBuilder(requiredStringGroup, requiredBooleanGroup, requiredInt64Group, stringGroup, booleanGroup, int64Group, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("testGroupParameters", localVarResponse)); - } - return CompletableFuture.completedFuture(null); - }); + return testGroupParametersWithHttpInfo(requiredStringGroup, requiredBooleanGroup, requiredInt64Group, stringGroup, booleanGroup, int64Group, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -2110,16 +2216,30 @@ public class FakeApi { HttpRequest.Builder localVarRequestBuilder = testGroupParametersRequestBuilder(requiredStringGroup, requiredBooleanGroup, requiredInt64Group, stringGroup, booleanGroup, int64Group, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } if (localVarResponse.statusCode()/ 100 != 2) { return CompletableFuture.failedFuture(getApiException("testGroupParameters", localVarResponse)); } - return CompletableFuture.completedFuture( - new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) - ); + try { + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } + return CompletableFuture.completedFuture( + new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } + } catch (IOException e) { + return CompletableFuture.failedFuture(new ApiException(e)); + } } ); } @@ -2299,15 +2419,8 @@ public class FakeApi { */ public CompletableFuture testInlineAdditionalProperties(@javax.annotation.Nonnull Map requestBody, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = testInlineAdditionalPropertiesRequestBuilder(requestBody, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("testInlineAdditionalProperties", localVarResponse)); - } - return CompletableFuture.completedFuture(null); - }); + return testInlineAdditionalPropertiesWithHttpInfo(requestBody, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -2338,16 +2451,30 @@ public class FakeApi { HttpRequest.Builder localVarRequestBuilder = testInlineAdditionalPropertiesRequestBuilder(requestBody, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } if (localVarResponse.statusCode()/ 100 != 2) { return CompletableFuture.failedFuture(getApiException("testInlineAdditionalProperties", localVarResponse)); } - return CompletableFuture.completedFuture( - new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) - ); + try { + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } + return CompletableFuture.completedFuture( + new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } + } catch (IOException e) { + return CompletableFuture.failedFuture(new ApiException(e)); + } } ); } @@ -2409,15 +2536,8 @@ public class FakeApi { */ public CompletableFuture testInlineFreeformAdditionalProperties(@javax.annotation.Nonnull TestInlineFreeformAdditionalPropertiesRequest testInlineFreeformAdditionalPropertiesRequest, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = testInlineFreeformAdditionalPropertiesRequestBuilder(testInlineFreeformAdditionalPropertiesRequest, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("testInlineFreeformAdditionalProperties", localVarResponse)); - } - return CompletableFuture.completedFuture(null); - }); + return testInlineFreeformAdditionalPropertiesWithHttpInfo(testInlineFreeformAdditionalPropertiesRequest, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -2448,16 +2568,30 @@ public class FakeApi { HttpRequest.Builder localVarRequestBuilder = testInlineFreeformAdditionalPropertiesRequestBuilder(testInlineFreeformAdditionalPropertiesRequest, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } if (localVarResponse.statusCode()/ 100 != 2) { return CompletableFuture.failedFuture(getApiException("testInlineFreeformAdditionalProperties", localVarResponse)); } - return CompletableFuture.completedFuture( - new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) - ); + try { + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } + return CompletableFuture.completedFuture( + new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } + } catch (IOException e) { + return CompletableFuture.failedFuture(new ApiException(e)); + } } ); } @@ -2521,15 +2655,8 @@ public class FakeApi { */ public CompletableFuture testJsonFormData(@javax.annotation.Nonnull String param, @javax.annotation.Nonnull String param2, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = testJsonFormDataRequestBuilder(param, param2, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("testJsonFormData", localVarResponse)); - } - return CompletableFuture.completedFuture(null); - }); + return testJsonFormDataWithHttpInfo(param, param2, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -2562,16 +2689,30 @@ public class FakeApi { HttpRequest.Builder localVarRequestBuilder = testJsonFormDataRequestBuilder(param, param2, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } if (localVarResponse.statusCode()/ 100 != 2) { return CompletableFuture.failedFuture(getApiException("testJsonFormData", localVarResponse)); } - return CompletableFuture.completedFuture( - new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) - ); + try { + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } + return CompletableFuture.completedFuture( + new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } + } catch (IOException e) { + return CompletableFuture.failedFuture(new ApiException(e)); + } } ); } @@ -2612,10 +2753,11 @@ public class FakeApi { } catch (IOException e) { throw new RuntimeException(e); } + byte[] formBytes = formOutputStream.toByteArray(); localVarRequestBuilder .header("Content-Type", entity.getContentType().getValue()) .method("GET", HttpRequest.BodyPublishers - .ofInputStream(() -> new ByteArrayInputStream(formOutputStream.toByteArray()))); + .ofInputStream(() -> new ByteArrayInputStream(formBytes))); if (memberVarReadTimeout != null) { localVarRequestBuilder.timeout(memberVarReadTimeout); } @@ -2656,15 +2798,8 @@ public class FakeApi { */ public CompletableFuture testQueryParameterCollectionFormat(@javax.annotation.Nonnull List pipe, @javax.annotation.Nonnull List ioutil, @javax.annotation.Nonnull List http, @javax.annotation.Nonnull List url, @javax.annotation.Nonnull List context, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = testQueryParameterCollectionFormatRequestBuilder(pipe, ioutil, http, url, context, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("testQueryParameterCollectionFormat", localVarResponse)); - } - return CompletableFuture.completedFuture(null); - }); + return testQueryParameterCollectionFormatWithHttpInfo(pipe, ioutil, http, url, context, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -2703,16 +2838,30 @@ public class FakeApi { HttpRequest.Builder localVarRequestBuilder = testQueryParameterCollectionFormatRequestBuilder(pipe, ioutil, http, url, context, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } if (localVarResponse.statusCode()/ 100 != 2) { return CompletableFuture.failedFuture(getApiException("testQueryParameterCollectionFormat", localVarResponse)); } - return CompletableFuture.completedFuture( - new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) - ); + try { + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } + return CompletableFuture.completedFuture( + new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } + } catch (IOException e) { + return CompletableFuture.failedFuture(new ApiException(e)); + } } ); } @@ -2807,15 +2956,8 @@ public class FakeApi { */ public CompletableFuture testStringMapReference(@javax.annotation.Nonnull Map requestBody, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = testStringMapReferenceRequestBuilder(requestBody, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("testStringMapReference", localVarResponse)); - } - return CompletableFuture.completedFuture(null); - }); + return testStringMapReferenceWithHttpInfo(requestBody, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -2846,16 +2988,30 @@ public class FakeApi { HttpRequest.Builder localVarRequestBuilder = testStringMapReferenceRequestBuilder(requestBody, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } if (localVarResponse.statusCode()/ 100 != 2) { return CompletableFuture.failedFuture(getApiException("testStringMapReference", localVarResponse)); } - return CompletableFuture.completedFuture( - new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) - ); + try { + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } + return CompletableFuture.completedFuture( + new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } + } catch (IOException e) { + return CompletableFuture.failedFuture(new ApiException(e)); + } } ); } diff --git a/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/api/FakeClassnameTags123Api.java b/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/api/FakeClassnameTags123Api.java index 465f4c03498b..3982c43125c5 100644 --- a/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/api/FakeClassnameTags123Api.java +++ b/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/api/FakeClassnameTags123Api.java @@ -82,7 +82,7 @@ public class FakeClassnameTags123Api { private final Consumer memberVarInterceptor; private final Duration memberVarReadTimeout; private final Consumer> memberVarResponseInterceptor; - private final Consumer> memberVarAsyncResponseInterceptor; + private final Consumer> memberVarAsyncResponseInterceptor; public FakeClassnameTags123Api() { this(Configuration.getDefaultApiClient()); @@ -99,9 +99,19 @@ public class FakeClassnameTags123Api { } - private ApiException getApiException(String operationId, HttpResponse response) { - String message = formatExceptionMessage(operationId, response.statusCode(), response.body()); - return new ApiException(response.statusCode(), message, response.headers(), response.body()); + private ApiException getApiException(String operationId, HttpResponse response) { + try { + InputStream responseBody = ApiClient.getResponseBody(response); + String body = null; + if (responseBody != null) { + body = new String(responseBody.readAllBytes()); + responseBody.close(); + } + String message = formatExceptionMessage(operationId, response.statusCode(), body); + return new ApiException(response.statusCode(), message, response.headers(), body); + } catch (IOException e) { + return new ApiException(e); + } } private String formatExceptionMessage(String operationId, int statusCode, String body) { @@ -118,10 +128,13 @@ public class FakeClassnameTags123Api { * @return File * @throws ApiException If fail to read file content from response and write to disk */ - public File downloadFileFromResponse(HttpResponse response) throws ApiException { + public File downloadFileFromResponse(HttpResponse response, InputStream responseBody) throws ApiException { + if (responseBody == null) { + throw new ApiException(new IOException("Response body is empty")); + } try { File file = prepareDownloadFile(response); - java.nio.file.Files.copy(response.body(), file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); + java.nio.file.Files.copy(responseBody, file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); return file; } catch (IOException e) { throw new ApiException(e); @@ -180,22 +193,8 @@ public class FakeClassnameTags123Api { */ public CompletableFuture testClassname(@javax.annotation.Nonnull Client client, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = testClassnameRequestBuilder(client, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("testClassname", localVarResponse)); - } - try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference() {}) - ); - } catch (IOException e) { - return CompletableFuture.failedFuture(new ApiException(e)); - } - }); + return testClassnameWithHttpInfo(client, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -226,7 +225,7 @@ public class FakeClassnameTags123Api { HttpRequest.Builder localVarRequestBuilder = testClassnameRequestBuilder(client, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } @@ -234,13 +233,34 @@ public class FakeClassnameTags123Api { return CompletableFuture.failedFuture(getApiException("testClassname", localVarResponse)); } try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - new ApiResponse( - localVarResponse.statusCode(), - localVarResponse.headers().map(), - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference() {})) - ); + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody == null) { + return CompletableFuture.completedFuture( + new ApiResponse( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + null + ) + ); + } + + + String responseBody = new String(localVarResponseBody.readAllBytes()); + Client responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); + + return CompletableFuture.completedFuture( + new ApiResponse( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + responseValue + ) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } } catch (IOException e) { return CompletableFuture.failedFuture(new ApiException(e)); } diff --git a/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/api/PetApi.java b/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/api/PetApi.java index 6cd08e3fe465..b378f6323824 100644 --- a/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/api/PetApi.java +++ b/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/api/PetApi.java @@ -84,7 +84,7 @@ public class PetApi { private final Consumer memberVarInterceptor; private final Duration memberVarReadTimeout; private final Consumer> memberVarResponseInterceptor; - private final Consumer> memberVarAsyncResponseInterceptor; + private final Consumer> memberVarAsyncResponseInterceptor; public PetApi() { this(Configuration.getDefaultApiClient()); @@ -101,9 +101,19 @@ public class PetApi { } - private ApiException getApiException(String operationId, HttpResponse response) { - String message = formatExceptionMessage(operationId, response.statusCode(), response.body()); - return new ApiException(response.statusCode(), message, response.headers(), response.body()); + private ApiException getApiException(String operationId, HttpResponse response) { + try { + InputStream responseBody = ApiClient.getResponseBody(response); + String body = null; + if (responseBody != null) { + body = new String(responseBody.readAllBytes()); + responseBody.close(); + } + String message = formatExceptionMessage(operationId, response.statusCode(), body); + return new ApiException(response.statusCode(), message, response.headers(), body); + } catch (IOException e) { + return new ApiException(e); + } } private String formatExceptionMessage(String operationId, int statusCode, String body) { @@ -120,10 +130,13 @@ public class PetApi { * @return File * @throws ApiException If fail to read file content from response and write to disk */ - public File downloadFileFromResponse(HttpResponse response) throws ApiException { + public File downloadFileFromResponse(HttpResponse response, InputStream responseBody) throws ApiException { + if (responseBody == null) { + throw new ApiException(new IOException("Response body is empty")); + } try { File file = prepareDownloadFile(response); - java.nio.file.Files.copy(response.body(), file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); + java.nio.file.Files.copy(responseBody, file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); return file; } catch (IOException e) { throw new ApiException(e); @@ -182,15 +195,8 @@ public class PetApi { */ public CompletableFuture addPet(@javax.annotation.Nonnull Pet pet, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = addPetRequestBuilder(pet, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("addPet", localVarResponse)); - } - return CompletableFuture.completedFuture(null); - }); + return addPetWithHttpInfo(pet, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -221,16 +227,30 @@ public class PetApi { HttpRequest.Builder localVarRequestBuilder = addPetRequestBuilder(pet, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } if (localVarResponse.statusCode()/ 100 != 2) { return CompletableFuture.failedFuture(getApiException("addPet", localVarResponse)); } - return CompletableFuture.completedFuture( - new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) - ); + try { + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } + return CompletableFuture.completedFuture( + new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } + } catch (IOException e) { + return CompletableFuture.failedFuture(new ApiException(e)); + } } ); } @@ -294,15 +314,8 @@ public class PetApi { */ public CompletableFuture deletePet(@javax.annotation.Nonnull Long petId, @javax.annotation.Nullable String apiKey, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = deletePetRequestBuilder(petId, apiKey, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("deletePet", localVarResponse)); - } - return CompletableFuture.completedFuture(null); - }); + return deletePetWithHttpInfo(petId, apiKey, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -335,16 +348,30 @@ public class PetApi { HttpRequest.Builder localVarRequestBuilder = deletePetRequestBuilder(petId, apiKey, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } if (localVarResponse.statusCode()/ 100 != 2) { return CompletableFuture.failedFuture(getApiException("deletePet", localVarResponse)); } - return CompletableFuture.completedFuture( - new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) - ); + try { + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } + return CompletableFuture.completedFuture( + new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } + } catch (IOException e) { + return CompletableFuture.failedFuture(new ApiException(e)); + } } ); } @@ -404,22 +431,8 @@ public class PetApi { */ public CompletableFuture> findPetsByStatus(@javax.annotation.Nonnull List status, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = findPetsByStatusRequestBuilder(status, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("findPetsByStatus", localVarResponse)); - } - try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference>() {}) - ); - } catch (IOException e) { - return CompletableFuture.failedFuture(new ApiException(e)); - } - }); + return findPetsByStatusWithHttpInfo(status, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -450,7 +463,7 @@ public class PetApi { HttpRequest.Builder localVarRequestBuilder = findPetsByStatusRequestBuilder(status, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } @@ -458,13 +471,34 @@ public class PetApi { return CompletableFuture.failedFuture(getApiException("findPetsByStatus", localVarResponse)); } try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - new ApiResponse>( - localVarResponse.statusCode(), - localVarResponse.headers().map(), - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference>() {})) - ); + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody == null) { + return CompletableFuture.completedFuture( + new ApiResponse>( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + null + ) + ); + } + + + String responseBody = new String(localVarResponseBody.readAllBytes()); + List responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference>() {}); + + return CompletableFuture.completedFuture( + new ApiResponse>( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + responseValue + ) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } } catch (IOException e) { return CompletableFuture.failedFuture(new ApiException(e)); } @@ -542,22 +576,8 @@ public class PetApi { @Deprecated public CompletableFuture> findPetsByTags(@javax.annotation.Nonnull List tags, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = findPetsByTagsRequestBuilder(tags, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("findPetsByTags", localVarResponse)); - } - try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference>() {}) - ); - } catch (IOException e) { - return CompletableFuture.failedFuture(new ApiException(e)); - } - }); + return findPetsByTagsWithHttpInfo(tags, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -592,7 +612,7 @@ public class PetApi { HttpRequest.Builder localVarRequestBuilder = findPetsByTagsRequestBuilder(tags, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } @@ -600,13 +620,34 @@ public class PetApi { return CompletableFuture.failedFuture(getApiException("findPetsByTags", localVarResponse)); } try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - new ApiResponse>( - localVarResponse.statusCode(), - localVarResponse.headers().map(), - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference>() {})) - ); + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody == null) { + return CompletableFuture.completedFuture( + new ApiResponse>( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + null + ) + ); + } + + + String responseBody = new String(localVarResponseBody.readAllBytes()); + List responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference>() {}); + + return CompletableFuture.completedFuture( + new ApiResponse>( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + responseValue + ) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } } catch (IOException e) { return CompletableFuture.failedFuture(new ApiException(e)); } @@ -680,22 +721,8 @@ public class PetApi { */ public CompletableFuture getPetById(@javax.annotation.Nonnull Long petId, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = getPetByIdRequestBuilder(petId, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("getPetById", localVarResponse)); - } - try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference() {}) - ); - } catch (IOException e) { - return CompletableFuture.failedFuture(new ApiException(e)); - } - }); + return getPetByIdWithHttpInfo(petId, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -726,7 +753,7 @@ public class PetApi { HttpRequest.Builder localVarRequestBuilder = getPetByIdRequestBuilder(petId, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } @@ -734,13 +761,34 @@ public class PetApi { return CompletableFuture.failedFuture(getApiException("getPetById", localVarResponse)); } try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - new ApiResponse( - localVarResponse.statusCode(), - localVarResponse.headers().map(), - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference() {})) - ); + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody == null) { + return CompletableFuture.completedFuture( + new ApiResponse( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + null + ) + ); + } + + + String responseBody = new String(localVarResponseBody.readAllBytes()); + Pet responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); + + return CompletableFuture.completedFuture( + new ApiResponse( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + responseValue + ) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } } catch (IOException e) { return CompletableFuture.failedFuture(new ApiException(e)); } @@ -800,15 +848,8 @@ public class PetApi { */ public CompletableFuture updatePet(@javax.annotation.Nonnull Pet pet, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = updatePetRequestBuilder(pet, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("updatePet", localVarResponse)); - } - return CompletableFuture.completedFuture(null); - }); + return updatePetWithHttpInfo(pet, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -839,16 +880,30 @@ public class PetApi { HttpRequest.Builder localVarRequestBuilder = updatePetRequestBuilder(pet, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } if (localVarResponse.statusCode()/ 100 != 2) { return CompletableFuture.failedFuture(getApiException("updatePet", localVarResponse)); } - return CompletableFuture.completedFuture( - new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) - ); + try { + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } + return CompletableFuture.completedFuture( + new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } + } catch (IOException e) { + return CompletableFuture.failedFuture(new ApiException(e)); + } } ); } @@ -914,15 +969,8 @@ public class PetApi { */ public CompletableFuture updatePetWithForm(@javax.annotation.Nonnull Long petId, @javax.annotation.Nullable String name, @javax.annotation.Nullable String status, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = updatePetWithFormRequestBuilder(petId, name, status, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("updatePetWithForm", localVarResponse)); - } - return CompletableFuture.completedFuture(null); - }); + return updatePetWithFormWithHttpInfo(petId, name, status, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -957,16 +1005,30 @@ public class PetApi { HttpRequest.Builder localVarRequestBuilder = updatePetWithFormRequestBuilder(petId, name, status, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } if (localVarResponse.statusCode()/ 100 != 2) { return CompletableFuture.failedFuture(getApiException("updatePetWithForm", localVarResponse)); } - return CompletableFuture.completedFuture( - new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) - ); + try { + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } + return CompletableFuture.completedFuture( + new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } + } catch (IOException e) { + return CompletableFuture.failedFuture(new ApiException(e)); + } } ); } @@ -1004,10 +1066,11 @@ public class PetApi { } catch (IOException e) { throw new RuntimeException(e); } + byte[] formBytes = formOutputStream.toByteArray(); localVarRequestBuilder .header("Content-Type", entity.getContentType().getValue()) .method("POST", HttpRequest.BodyPublishers - .ofInputStream(() -> new ByteArrayInputStream(formOutputStream.toByteArray()))); + .ofInputStream(() -> new ByteArrayInputStream(formBytes))); if (memberVarReadTimeout != null) { localVarRequestBuilder.timeout(memberVarReadTimeout); } @@ -1044,22 +1107,8 @@ public class PetApi { */ public CompletableFuture uploadFile(@javax.annotation.Nonnull Long petId, @javax.annotation.Nullable String additionalMetadata, @javax.annotation.Nullable File _file, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = uploadFileRequestBuilder(petId, additionalMetadata, _file, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("uploadFile", localVarResponse)); - } - try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference() {}) - ); - } catch (IOException e) { - return CompletableFuture.failedFuture(new ApiException(e)); - } - }); + return uploadFileWithHttpInfo(petId, additionalMetadata, _file, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -1094,7 +1143,7 @@ public class PetApi { HttpRequest.Builder localVarRequestBuilder = uploadFileRequestBuilder(petId, additionalMetadata, _file, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } @@ -1102,13 +1151,34 @@ public class PetApi { return CompletableFuture.failedFuture(getApiException("uploadFile", localVarResponse)); } try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - new ApiResponse( - localVarResponse.statusCode(), - localVarResponse.headers().map(), - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference() {})) - ); + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody == null) { + return CompletableFuture.completedFuture( + new ApiResponse( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + null + ) + ); + } + + + String responseBody = new String(localVarResponseBody.readAllBytes()); + ModelApiResponse responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); + + return CompletableFuture.completedFuture( + new ApiResponse( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + responseValue + ) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } } catch (IOException e) { return CompletableFuture.failedFuture(new ApiException(e)); } @@ -1166,8 +1236,9 @@ public class PetApi { } catch (IOException e) { throw new RuntimeException(e); } + byte[] formBytes = formOutputStream.toByteArray(); formDataPublisher = HttpRequest.BodyPublishers - .ofInputStream(() -> new ByteArrayInputStream(formOutputStream.toByteArray())); + .ofInputStream(() -> new ByteArrayInputStream(formBytes)); } localVarRequestBuilder .header("Content-Type", entity.getContentType().getValue()) @@ -1208,22 +1279,8 @@ public class PetApi { */ public CompletableFuture uploadFileWithRequiredFile(@javax.annotation.Nonnull Long petId, @javax.annotation.Nonnull File requiredFile, @javax.annotation.Nullable String additionalMetadata, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = uploadFileWithRequiredFileRequestBuilder(petId, requiredFile, additionalMetadata, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("uploadFileWithRequiredFile", localVarResponse)); - } - try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference() {}) - ); - } catch (IOException e) { - return CompletableFuture.failedFuture(new ApiException(e)); - } - }); + return uploadFileWithRequiredFileWithHttpInfo(petId, requiredFile, additionalMetadata, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -1258,7 +1315,7 @@ public class PetApi { HttpRequest.Builder localVarRequestBuilder = uploadFileWithRequiredFileRequestBuilder(petId, requiredFile, additionalMetadata, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } @@ -1266,13 +1323,34 @@ public class PetApi { return CompletableFuture.failedFuture(getApiException("uploadFileWithRequiredFile", localVarResponse)); } try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - new ApiResponse( - localVarResponse.statusCode(), - localVarResponse.headers().map(), - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference() {})) - ); + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody == null) { + return CompletableFuture.completedFuture( + new ApiResponse( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + null + ) + ); + } + + + String responseBody = new String(localVarResponseBody.readAllBytes()); + ModelApiResponse responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); + + return CompletableFuture.completedFuture( + new ApiResponse( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + responseValue + ) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } } catch (IOException e) { return CompletableFuture.failedFuture(new ApiException(e)); } @@ -1334,8 +1412,9 @@ public class PetApi { } catch (IOException e) { throw new RuntimeException(e); } + byte[] formBytes = formOutputStream.toByteArray(); formDataPublisher = HttpRequest.BodyPublishers - .ofInputStream(() -> new ByteArrayInputStream(formOutputStream.toByteArray())); + .ofInputStream(() -> new ByteArrayInputStream(formBytes)); } localVarRequestBuilder .header("Content-Type", entity.getContentType().getValue()) diff --git a/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/api/StoreApi.java b/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/api/StoreApi.java index 2d258653fe56..cb5d2a6086ed 100644 --- a/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/api/StoreApi.java +++ b/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/api/StoreApi.java @@ -82,7 +82,7 @@ public class StoreApi { private final Consumer memberVarInterceptor; private final Duration memberVarReadTimeout; private final Consumer> memberVarResponseInterceptor; - private final Consumer> memberVarAsyncResponseInterceptor; + private final Consumer> memberVarAsyncResponseInterceptor; public StoreApi() { this(Configuration.getDefaultApiClient()); @@ -99,9 +99,19 @@ public class StoreApi { } - private ApiException getApiException(String operationId, HttpResponse response) { - String message = formatExceptionMessage(operationId, response.statusCode(), response.body()); - return new ApiException(response.statusCode(), message, response.headers(), response.body()); + private ApiException getApiException(String operationId, HttpResponse response) { + try { + InputStream responseBody = ApiClient.getResponseBody(response); + String body = null; + if (responseBody != null) { + body = new String(responseBody.readAllBytes()); + responseBody.close(); + } + String message = formatExceptionMessage(operationId, response.statusCode(), body); + return new ApiException(response.statusCode(), message, response.headers(), body); + } catch (IOException e) { + return new ApiException(e); + } } private String formatExceptionMessage(String operationId, int statusCode, String body) { @@ -118,10 +128,13 @@ public class StoreApi { * @return File * @throws ApiException If fail to read file content from response and write to disk */ - public File downloadFileFromResponse(HttpResponse response) throws ApiException { + public File downloadFileFromResponse(HttpResponse response, InputStream responseBody) throws ApiException { + if (responseBody == null) { + throw new ApiException(new IOException("Response body is empty")); + } try { File file = prepareDownloadFile(response); - java.nio.file.Files.copy(response.body(), file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); + java.nio.file.Files.copy(responseBody, file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); return file; } catch (IOException e) { throw new ApiException(e); @@ -180,15 +193,8 @@ public class StoreApi { */ public CompletableFuture deleteOrder(@javax.annotation.Nonnull String orderId, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = deleteOrderRequestBuilder(orderId, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("deleteOrder", localVarResponse)); - } - return CompletableFuture.completedFuture(null); - }); + return deleteOrderWithHttpInfo(orderId, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -219,16 +225,30 @@ public class StoreApi { HttpRequest.Builder localVarRequestBuilder = deleteOrderRequestBuilder(orderId, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } if (localVarResponse.statusCode()/ 100 != 2) { return CompletableFuture.failedFuture(getApiException("deleteOrder", localVarResponse)); } - return CompletableFuture.completedFuture( - new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) - ); + try { + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } + return CompletableFuture.completedFuture( + new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } + } catch (IOException e) { + return CompletableFuture.failedFuture(new ApiException(e)); + } } ); } @@ -283,22 +303,8 @@ public class StoreApi { */ public CompletableFuture> getInventory(Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = getInventoryRequestBuilder(headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("getInventory", localVarResponse)); - } - try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference>() {}) - ); - } catch (IOException e) { - return CompletableFuture.failedFuture(new ApiException(e)); - } - }); + return getInventoryWithHttpInfo(headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -327,7 +333,7 @@ public class StoreApi { HttpRequest.Builder localVarRequestBuilder = getInventoryRequestBuilder(headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } @@ -335,13 +341,34 @@ public class StoreApi { return CompletableFuture.failedFuture(getApiException("getInventory", localVarResponse)); } try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - new ApiResponse>( - localVarResponse.statusCode(), - localVarResponse.headers().map(), - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference>() {})) - ); + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody == null) { + return CompletableFuture.completedFuture( + new ApiResponse>( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + null + ) + ); + } + + + String responseBody = new String(localVarResponseBody.readAllBytes()); + Map responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference>() {}); + + return CompletableFuture.completedFuture( + new ApiResponse>( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + responseValue + ) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } } catch (IOException e) { return CompletableFuture.failedFuture(new ApiException(e)); } @@ -396,22 +423,8 @@ public class StoreApi { */ public CompletableFuture getOrderById(@javax.annotation.Nonnull Long orderId, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = getOrderByIdRequestBuilder(orderId, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("getOrderById", localVarResponse)); - } - try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference() {}) - ); - } catch (IOException e) { - return CompletableFuture.failedFuture(new ApiException(e)); - } - }); + return getOrderByIdWithHttpInfo(orderId, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -442,7 +455,7 @@ public class StoreApi { HttpRequest.Builder localVarRequestBuilder = getOrderByIdRequestBuilder(orderId, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } @@ -450,13 +463,34 @@ public class StoreApi { return CompletableFuture.failedFuture(getApiException("getOrderById", localVarResponse)); } try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - new ApiResponse( - localVarResponse.statusCode(), - localVarResponse.headers().map(), - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference() {})) - ); + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody == null) { + return CompletableFuture.completedFuture( + new ApiResponse( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + null + ) + ); + } + + + String responseBody = new String(localVarResponseBody.readAllBytes()); + Order responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); + + return CompletableFuture.completedFuture( + new ApiResponse( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + responseValue + ) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } } catch (IOException e) { return CompletableFuture.failedFuture(new ApiException(e)); } @@ -516,22 +550,8 @@ public class StoreApi { */ public CompletableFuture placeOrder(@javax.annotation.Nonnull Order order, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = placeOrderRequestBuilder(order, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("placeOrder", localVarResponse)); - } - try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference() {}) - ); - } catch (IOException e) { - return CompletableFuture.failedFuture(new ApiException(e)); - } - }); + return placeOrderWithHttpInfo(order, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -562,7 +582,7 @@ public class StoreApi { HttpRequest.Builder localVarRequestBuilder = placeOrderRequestBuilder(order, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } @@ -570,13 +590,34 @@ public class StoreApi { return CompletableFuture.failedFuture(getApiException("placeOrder", localVarResponse)); } try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - new ApiResponse( - localVarResponse.statusCode(), - localVarResponse.headers().map(), - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference() {})) - ); + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody == null) { + return CompletableFuture.completedFuture( + new ApiResponse( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + null + ) + ); + } + + + String responseBody = new String(localVarResponseBody.readAllBytes()); + Order responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); + + return CompletableFuture.completedFuture( + new ApiResponse( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + responseValue + ) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } } catch (IOException e) { return CompletableFuture.failedFuture(new ApiException(e)); } diff --git a/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/api/UserApi.java b/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/api/UserApi.java index 773369d5e341..b80d6dd06b25 100644 --- a/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/api/UserApi.java +++ b/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/api/UserApi.java @@ -83,7 +83,7 @@ public class UserApi { private final Consumer memberVarInterceptor; private final Duration memberVarReadTimeout; private final Consumer> memberVarResponseInterceptor; - private final Consumer> memberVarAsyncResponseInterceptor; + private final Consumer> memberVarAsyncResponseInterceptor; public UserApi() { this(Configuration.getDefaultApiClient()); @@ -100,9 +100,19 @@ public class UserApi { } - private ApiException getApiException(String operationId, HttpResponse response) { - String message = formatExceptionMessage(operationId, response.statusCode(), response.body()); - return new ApiException(response.statusCode(), message, response.headers(), response.body()); + private ApiException getApiException(String operationId, HttpResponse response) { + try { + InputStream responseBody = ApiClient.getResponseBody(response); + String body = null; + if (responseBody != null) { + body = new String(responseBody.readAllBytes()); + responseBody.close(); + } + String message = formatExceptionMessage(operationId, response.statusCode(), body); + return new ApiException(response.statusCode(), message, response.headers(), body); + } catch (IOException e) { + return new ApiException(e); + } } private String formatExceptionMessage(String operationId, int statusCode, String body) { @@ -119,10 +129,13 @@ public class UserApi { * @return File * @throws ApiException If fail to read file content from response and write to disk */ - public File downloadFileFromResponse(HttpResponse response) throws ApiException { + public File downloadFileFromResponse(HttpResponse response, InputStream responseBody) throws ApiException { + if (responseBody == null) { + throw new ApiException(new IOException("Response body is empty")); + } try { File file = prepareDownloadFile(response); - java.nio.file.Files.copy(response.body(), file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); + java.nio.file.Files.copy(responseBody, file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); return file; } catch (IOException e) { throw new ApiException(e); @@ -181,15 +194,8 @@ public class UserApi { */ public CompletableFuture createUser(@javax.annotation.Nonnull User user, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = createUserRequestBuilder(user, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("createUser", localVarResponse)); - } - return CompletableFuture.completedFuture(null); - }); + return createUserWithHttpInfo(user, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -220,16 +226,30 @@ public class UserApi { HttpRequest.Builder localVarRequestBuilder = createUserRequestBuilder(user, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } if (localVarResponse.statusCode()/ 100 != 2) { return CompletableFuture.failedFuture(getApiException("createUser", localVarResponse)); } - return CompletableFuture.completedFuture( - new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) - ); + try { + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } + return CompletableFuture.completedFuture( + new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } + } catch (IOException e) { + return CompletableFuture.failedFuture(new ApiException(e)); + } } ); } @@ -291,15 +311,8 @@ public class UserApi { */ public CompletableFuture createUsersWithArrayInput(@javax.annotation.Nonnull List user, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = createUsersWithArrayInputRequestBuilder(user, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("createUsersWithArrayInput", localVarResponse)); - } - return CompletableFuture.completedFuture(null); - }); + return createUsersWithArrayInputWithHttpInfo(user, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -330,16 +343,30 @@ public class UserApi { HttpRequest.Builder localVarRequestBuilder = createUsersWithArrayInputRequestBuilder(user, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } if (localVarResponse.statusCode()/ 100 != 2) { return CompletableFuture.failedFuture(getApiException("createUsersWithArrayInput", localVarResponse)); } - return CompletableFuture.completedFuture( - new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) - ); + try { + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } + return CompletableFuture.completedFuture( + new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } + } catch (IOException e) { + return CompletableFuture.failedFuture(new ApiException(e)); + } } ); } @@ -401,15 +428,8 @@ public class UserApi { */ public CompletableFuture createUsersWithListInput(@javax.annotation.Nonnull List user, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = createUsersWithListInputRequestBuilder(user, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("createUsersWithListInput", localVarResponse)); - } - return CompletableFuture.completedFuture(null); - }); + return createUsersWithListInputWithHttpInfo(user, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -440,16 +460,30 @@ public class UserApi { HttpRequest.Builder localVarRequestBuilder = createUsersWithListInputRequestBuilder(user, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } if (localVarResponse.statusCode()/ 100 != 2) { return CompletableFuture.failedFuture(getApiException("createUsersWithListInput", localVarResponse)); } - return CompletableFuture.completedFuture( - new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) - ); + try { + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } + return CompletableFuture.completedFuture( + new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } + } catch (IOException e) { + return CompletableFuture.failedFuture(new ApiException(e)); + } } ); } @@ -511,15 +545,8 @@ public class UserApi { */ public CompletableFuture deleteUser(@javax.annotation.Nonnull String username, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = deleteUserRequestBuilder(username, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("deleteUser", localVarResponse)); - } - return CompletableFuture.completedFuture(null); - }); + return deleteUserWithHttpInfo(username, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -550,16 +577,30 @@ public class UserApi { HttpRequest.Builder localVarRequestBuilder = deleteUserRequestBuilder(username, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } if (localVarResponse.statusCode()/ 100 != 2) { return CompletableFuture.failedFuture(getApiException("deleteUser", localVarResponse)); } - return CompletableFuture.completedFuture( - new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) - ); + try { + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } + return CompletableFuture.completedFuture( + new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } + } catch (IOException e) { + return CompletableFuture.failedFuture(new ApiException(e)); + } } ); } @@ -616,22 +657,8 @@ public class UserApi { */ public CompletableFuture getUserByName(@javax.annotation.Nonnull String username, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = getUserByNameRequestBuilder(username, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("getUserByName", localVarResponse)); - } - try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference() {}) - ); - } catch (IOException e) { - return CompletableFuture.failedFuture(new ApiException(e)); - } - }); + return getUserByNameWithHttpInfo(username, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -662,7 +689,7 @@ public class UserApi { HttpRequest.Builder localVarRequestBuilder = getUserByNameRequestBuilder(username, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } @@ -670,13 +697,34 @@ public class UserApi { return CompletableFuture.failedFuture(getApiException("getUserByName", localVarResponse)); } try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - new ApiResponse( - localVarResponse.statusCode(), - localVarResponse.headers().map(), - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference() {})) - ); + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody == null) { + return CompletableFuture.completedFuture( + new ApiResponse( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + null + ) + ); + } + + + String responseBody = new String(localVarResponseBody.readAllBytes()); + User responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); + + return CompletableFuture.completedFuture( + new ApiResponse( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + responseValue + ) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } } catch (IOException e) { return CompletableFuture.failedFuture(new ApiException(e)); } @@ -738,22 +786,8 @@ public class UserApi { */ public CompletableFuture loginUser(@javax.annotation.Nonnull String username, @javax.annotation.Nonnull String password, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = loginUserRequestBuilder(username, password, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("loginUser", localVarResponse)); - } - try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference() {}) - ); - } catch (IOException e) { - return CompletableFuture.failedFuture(new ApiException(e)); - } - }); + return loginUserWithHttpInfo(username, password, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -786,7 +820,7 @@ public class UserApi { HttpRequest.Builder localVarRequestBuilder = loginUserRequestBuilder(username, password, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } @@ -794,13 +828,34 @@ public class UserApi { return CompletableFuture.failedFuture(getApiException("loginUser", localVarResponse)); } try { - String responseBody = localVarResponse.body(); - return CompletableFuture.completedFuture( - new ApiResponse( - localVarResponse.statusCode(), - localVarResponse.headers().map(), - responseBody == null || responseBody.isBlank() ? null : memberVarObjectMapper.readValue(responseBody, new TypeReference() {})) - ); + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody == null) { + return CompletableFuture.completedFuture( + new ApiResponse( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + null + ) + ); + } + + + String responseBody = new String(localVarResponseBody.readAllBytes()); + String responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); + + return CompletableFuture.completedFuture( + new ApiResponse( + localVarResponse.statusCode(), + localVarResponse.headers().map(), + responseValue + ) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } } catch (IOException e) { return CompletableFuture.failedFuture(new ApiException(e)); } @@ -878,15 +933,8 @@ public class UserApi { */ public CompletableFuture logoutUser(Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = logoutUserRequestBuilder(headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("logoutUser", localVarResponse)); - } - return CompletableFuture.completedFuture(null); - }); + return logoutUserWithHttpInfo(headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -915,16 +963,30 @@ public class UserApi { HttpRequest.Builder localVarRequestBuilder = logoutUserRequestBuilder(headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } if (localVarResponse.statusCode()/ 100 != 2) { return CompletableFuture.failedFuture(getApiException("logoutUser", localVarResponse)); } - return CompletableFuture.completedFuture( - new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) - ); + try { + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } + return CompletableFuture.completedFuture( + new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } + } catch (IOException e) { + return CompletableFuture.failedFuture(new ApiException(e)); + } } ); } @@ -978,15 +1040,8 @@ public class UserApi { */ public CompletableFuture updateUser(@javax.annotation.Nonnull String username, @javax.annotation.Nonnull User user, Map headers) throws ApiException { try { - HttpRequest.Builder localVarRequestBuilder = updateUserRequestBuilder(username, user, headers); - return memberVarHttpClient.sendAsync( - localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { - if (localVarResponse.statusCode()/ 100 != 2) { - return CompletableFuture.failedFuture(getApiException("updateUser", localVarResponse)); - } - return CompletableFuture.completedFuture(null); - }); + return updateUserWithHttpInfo(username, user, headers) + .thenApply(ApiResponse::getData); } catch (ApiException e) { return CompletableFuture.failedFuture(e); @@ -1019,16 +1074,30 @@ public class UserApi { HttpRequest.Builder localVarRequestBuilder = updateUserRequestBuilder(username, user, headers); return memberVarHttpClient.sendAsync( localVarRequestBuilder.build(), - HttpResponse.BodyHandlers.ofString()).thenComposeAsync(localVarResponse -> { + HttpResponse.BodyHandlers.ofInputStream()).thenComposeAsync(localVarResponse -> { if (memberVarAsyncResponseInterceptor != null) { memberVarAsyncResponseInterceptor.accept(localVarResponse); } if (localVarResponse.statusCode()/ 100 != 2) { return CompletableFuture.failedFuture(getApiException("updateUser", localVarResponse)); } - return CompletableFuture.completedFuture( - new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) - ); + try { + InputStream localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + try { + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } + return CompletableFuture.completedFuture( + new ApiResponse(localVarResponse.statusCode(), localVarResponse.headers().map(), null) + ); + } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } + } + } catch (IOException e) { + return CompletableFuture.failedFuture(new ApiException(e)); + } } ); } diff --git a/samples/client/petstore/java/native-jakarta/src/main/java/org/openapitools/client/ApiClient.java b/samples/client/petstore/java/native-jakarta/src/main/java/org/openapitools/client/ApiClient.java index d53616ec57bf..f3e37e58684c 100644 --- a/samples/client/petstore/java/native-jakarta/src/main/java/org/openapitools/client/ApiClient.java +++ b/samples/client/petstore/java/native-jakarta/src/main/java/org/openapitools/client/ApiClient.java @@ -20,6 +20,7 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import org.openapitools.jackson.nullable.JsonNullableModule; import java.io.InputStream; +import java.io.IOException; import java.net.URI; import java.net.URLEncoder; import java.net.http.HttpClient; @@ -34,6 +35,8 @@ import java.util.Collections; import java.util.List; import java.util.StringJoiner; import java.util.function.Consumer; +import java.util.Optional; +import java.util.zip.GZIPInputStream; import java.util.stream.Collectors; import static java.nio.charset.StandardCharsets.UTF_8; @@ -62,7 +65,7 @@ public class ApiClient { protected String basePath; protected Consumer interceptor; protected Consumer> responseInterceptor; - protected Consumer> asyncResponseInterceptor; + protected Consumer> asyncResponseInterceptor; protected Duration readTimeout; protected Duration connectTimeout; @@ -384,7 +387,7 @@ public class ApiClient { * of null resets the interceptor to a no-op. * @return This object. */ - public ApiClient setAsyncResponseInterceptor(Consumer> interceptor) { + public ApiClient setAsyncResponseInterceptor(Consumer> interceptor) { this.asyncResponseInterceptor = interceptor; return this; } @@ -394,7 +397,7 @@ public class ApiClient { * * @return The custom interceptor that was set, or null if there isn't any. */ - public Consumer> getAsyncResponseInterceptor() { + public Consumer> getAsyncResponseInterceptor() { return asyncResponseInterceptor; } @@ -454,4 +457,32 @@ public class ApiClient { public Duration getConnectTimeout() { return connectTimeout; } + + /** + * Returns the response body InputStream, transparently decoding gzip-compressed + * payloads when the server sets {@code Content-Encoding: gzip}. + * + * @param response HTTP response whose body should be consumed + * @return Original or decompressed InputStream for the response body + * @throws IOException if the response body cannot be accessed or wrapping fails + */ + public static InputStream getResponseBody(HttpResponse response) throws IOException { + if (response == null) { + return null; + } + InputStream body = response.body(); + if (body == null) { + return null; + } + Optional encoding = response.headers().firstValue("Content-Encoding"); + if (encoding.isPresent()) { + for (String token : encoding.get().split(",")) { + if ("gzip".equalsIgnoreCase(token.trim())) { + return new GZIPInputStream(body); + } + } + } + return body; + } + } diff --git a/samples/client/petstore/java/native-jakarta/src/main/java/org/openapitools/client/api/PetApi.java b/samples/client/petstore/java/native-jakarta/src/main/java/org/openapitools/client/api/PetApi.java index bb8f6a3f1b45..6f93450ff3e2 100644 --- a/samples/client/petstore/java/native-jakarta/src/main/java/org/openapitools/client/api/PetApi.java +++ b/samples/client/petstore/java/native-jakarta/src/main/java/org/openapitools/client/api/PetApi.java @@ -82,7 +82,7 @@ public class PetApi { private final Consumer memberVarInterceptor; private final Duration memberVarReadTimeout; private final Consumer> memberVarResponseInterceptor; - private final Consumer> memberVarAsyncResponseInterceptor; + private final Consumer> memberVarAsyncResponseInterceptor; public PetApi() { this(Configuration.getDefaultApiClient()); @@ -100,7 +100,15 @@ public class PetApi { protected ApiException getApiException(String operationId, HttpResponse response) throws IOException { - String body = response.body() == null ? null : new String(response.body().readAllBytes()); + InputStream responseBody = ApiClient.getResponseBody(response); + String body = null; + try { + body = responseBody == null ? null : new String(responseBody.readAllBytes()); + } finally { + if (responseBody != null) { + responseBody.close(); + } + } String message = formatExceptionMessage(operationId, response.statusCode(), body); return new ApiException(response.statusCode(), message, response.headers(), body); } @@ -119,10 +127,13 @@ public class PetApi { * @return File * @throws ApiException If fail to read file content from response and write to disk */ - public File downloadFileFromResponse(HttpResponse response) throws ApiException { + public File downloadFileFromResponse(HttpResponse response, InputStream responseBody) throws ApiException { + if (responseBody == null) { + throw new ApiException(new IOException("Response body is empty")); + } try { File file = prepareDownloadFile(response); - java.nio.file.Files.copy(response.body(), file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); + java.nio.file.Files.copy(responseBody, file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); return file; } catch (IOException e) { throw new ApiException(e); @@ -212,11 +223,13 @@ public class PetApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("addPet", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -226,10 +239,9 @@ public class PetApi { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); Pet responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); - localVarResponse.body().close(); return new ApiResponse( localVarResponse.statusCode(), @@ -237,6 +249,9 @@ public class PetApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -332,21 +347,24 @@ public class PetApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("deletePet", localVarResponse); } + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } return new ApiResponse<>( localVarResponse.statusCode(), localVarResponse.headers().map(), null ); } finally { - // Drain the InputStream - while (localVarResponse.body().read() != -1) { - // Ignore + if (localVarResponseBody != null) { + localVarResponseBody.close(); } - localVarResponse.body().close(); } } catch (IOException e) { throw new ApiException(e); @@ -439,11 +457,13 @@ public class PetApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("findPetsByStatus", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse>( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -453,10 +473,9 @@ public class PetApi { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); List responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference>() {}); - localVarResponse.body().close(); return new ApiResponse>( localVarResponse.statusCode(), @@ -464,6 +483,9 @@ public class PetApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -575,11 +597,13 @@ public class PetApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("findPetsByTags", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse>( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -589,10 +613,9 @@ public class PetApi { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); List responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference>() {}); - localVarResponse.body().close(); return new ApiResponse>( localVarResponse.statusCode(), @@ -600,6 +623,9 @@ public class PetApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -703,11 +729,13 @@ public class PetApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("getPetById", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -717,10 +745,9 @@ public class PetApi { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); Pet responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); - localVarResponse.body().close(); return new ApiResponse( localVarResponse.statusCode(), @@ -728,6 +755,9 @@ public class PetApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -825,11 +855,13 @@ public class PetApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("updatePet", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -839,10 +871,9 @@ public class PetApi { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); Pet responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); - localVarResponse.body().close(); return new ApiResponse( localVarResponse.statusCode(), @@ -850,6 +881,9 @@ public class PetApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -949,21 +983,24 @@ public class PetApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("updatePetWithForm", localVarResponse); } + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } return new ApiResponse<>( localVarResponse.statusCode(), localVarResponse.headers().map(), null ); } finally { - // Drain the InputStream - while (localVarResponse.body().read() != -1) { - // Ignore + if (localVarResponseBody != null) { + localVarResponseBody.close(); } - localVarResponse.body().close(); } } catch (IOException e) { throw new ApiException(e); @@ -1003,10 +1040,11 @@ public class PetApi { } catch (IOException e) { throw new RuntimeException(e); } + byte[] formBytes = formOutputStream.toByteArray(); localVarRequestBuilder .header("Content-Type", entity.getContentType().getValue()) .method("POST", HttpRequest.BodyPublishers - .ofInputStream(() -> new ByteArrayInputStream(formOutputStream.toByteArray()))); + .ofInputStream(() -> new ByteArrayInputStream(formBytes))); if (memberVarReadTimeout != null) { localVarRequestBuilder.timeout(memberVarReadTimeout); } @@ -1078,11 +1116,13 @@ public class PetApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("uploadFile", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -1092,10 +1132,9 @@ public class PetApi { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); ModelApiResponse responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); - localVarResponse.body().close(); return new ApiResponse( localVarResponse.statusCode(), @@ -1103,6 +1142,9 @@ public class PetApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -1159,8 +1201,9 @@ public class PetApi { } catch (IOException e) { throw new RuntimeException(e); } + byte[] formBytes = formOutputStream.toByteArray(); formDataPublisher = HttpRequest.BodyPublishers - .ofInputStream(() -> new ByteArrayInputStream(formOutputStream.toByteArray())); + .ofInputStream(() -> new ByteArrayInputStream(formBytes)); } localVarRequestBuilder .header("Content-Type", entity.getContentType().getValue()) diff --git a/samples/client/petstore/java/native-jakarta/src/main/java/org/openapitools/client/api/StoreApi.java b/samples/client/petstore/java/native-jakarta/src/main/java/org/openapitools/client/api/StoreApi.java index af2b873980c6..31f0574aee8a 100644 --- a/samples/client/petstore/java/native-jakarta/src/main/java/org/openapitools/client/api/StoreApi.java +++ b/samples/client/petstore/java/native-jakarta/src/main/java/org/openapitools/client/api/StoreApi.java @@ -80,7 +80,7 @@ public class StoreApi { private final Consumer memberVarInterceptor; private final Duration memberVarReadTimeout; private final Consumer> memberVarResponseInterceptor; - private final Consumer> memberVarAsyncResponseInterceptor; + private final Consumer> memberVarAsyncResponseInterceptor; public StoreApi() { this(Configuration.getDefaultApiClient()); @@ -98,7 +98,15 @@ public class StoreApi { protected ApiException getApiException(String operationId, HttpResponse response) throws IOException { - String body = response.body() == null ? null : new String(response.body().readAllBytes()); + InputStream responseBody = ApiClient.getResponseBody(response); + String body = null; + try { + body = responseBody == null ? null : new String(responseBody.readAllBytes()); + } finally { + if (responseBody != null) { + responseBody.close(); + } + } String message = formatExceptionMessage(operationId, response.statusCode(), body); return new ApiException(response.statusCode(), message, response.headers(), body); } @@ -117,10 +125,13 @@ public class StoreApi { * @return File * @throws ApiException If fail to read file content from response and write to disk */ - public File downloadFileFromResponse(HttpResponse response) throws ApiException { + public File downloadFileFromResponse(HttpResponse response, InputStream responseBody) throws ApiException { + if (responseBody == null) { + throw new ApiException(new IOException("Response body is empty")); + } try { File file = prepareDownloadFile(response); - java.nio.file.Files.copy(response.body(), file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); + java.nio.file.Files.copy(responseBody, file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); return file; } catch (IOException e) { throw new ApiException(e); @@ -207,21 +218,24 @@ public class StoreApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("deleteOrder", localVarResponse); } + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } return new ApiResponse<>( localVarResponse.statusCode(), localVarResponse.headers().map(), null ); } finally { - // Drain the InputStream - while (localVarResponse.body().read() != -1) { - // Ignore + if (localVarResponseBody != null) { + localVarResponseBody.close(); } - localVarResponse.body().close(); } } catch (IOException e) { throw new ApiException(e); @@ -307,11 +321,13 @@ public class StoreApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("getInventory", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse>( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -321,10 +337,9 @@ public class StoreApi { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); Map responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference>() {}); - localVarResponse.body().close(); return new ApiResponse>( localVarResponse.statusCode(), @@ -332,6 +347,9 @@ public class StoreApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -416,11 +434,13 @@ public class StoreApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("getOrderById", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -430,10 +450,9 @@ public class StoreApi { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); Order responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); - localVarResponse.body().close(); return new ApiResponse( localVarResponse.statusCode(), @@ -441,6 +460,9 @@ public class StoreApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -530,11 +552,13 @@ public class StoreApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("placeOrder", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -544,10 +568,9 @@ public class StoreApi { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); Order responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); - localVarResponse.body().close(); return new ApiResponse( localVarResponse.statusCode(), @@ -555,6 +578,9 @@ public class StoreApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); diff --git a/samples/client/petstore/java/native-jakarta/src/main/java/org/openapitools/client/api/UserApi.java b/samples/client/petstore/java/native-jakarta/src/main/java/org/openapitools/client/api/UserApi.java index c32bd523502b..44afc71d96db 100644 --- a/samples/client/petstore/java/native-jakarta/src/main/java/org/openapitools/client/api/UserApi.java +++ b/samples/client/petstore/java/native-jakarta/src/main/java/org/openapitools/client/api/UserApi.java @@ -81,7 +81,7 @@ public class UserApi { private final Consumer memberVarInterceptor; private final Duration memberVarReadTimeout; private final Consumer> memberVarResponseInterceptor; - private final Consumer> memberVarAsyncResponseInterceptor; + private final Consumer> memberVarAsyncResponseInterceptor; public UserApi() { this(Configuration.getDefaultApiClient()); @@ -99,7 +99,15 @@ public class UserApi { protected ApiException getApiException(String operationId, HttpResponse response) throws IOException { - String body = response.body() == null ? null : new String(response.body().readAllBytes()); + InputStream responseBody = ApiClient.getResponseBody(response); + String body = null; + try { + body = responseBody == null ? null : new String(responseBody.readAllBytes()); + } finally { + if (responseBody != null) { + responseBody.close(); + } + } String message = formatExceptionMessage(operationId, response.statusCode(), body); return new ApiException(response.statusCode(), message, response.headers(), body); } @@ -118,10 +126,13 @@ public class UserApi { * @return File * @throws ApiException If fail to read file content from response and write to disk */ - public File downloadFileFromResponse(HttpResponse response) throws ApiException { + public File downloadFileFromResponse(HttpResponse response, InputStream responseBody) throws ApiException { + if (responseBody == null) { + throw new ApiException(new IOException("Response body is empty")); + } try { File file = prepareDownloadFile(response); - java.nio.file.Files.copy(response.body(), file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); + java.nio.file.Files.copy(responseBody, file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); return file; } catch (IOException e) { throw new ApiException(e); @@ -208,21 +219,24 @@ public class UserApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("createUser", localVarResponse); } + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } return new ApiResponse<>( localVarResponse.statusCode(), localVarResponse.headers().map(), null ); } finally { - // Drain the InputStream - while (localVarResponse.body().read() != -1) { - // Ignore + if (localVarResponseBody != null) { + localVarResponseBody.close(); } - localVarResponse.body().close(); } } catch (IOException e) { throw new ApiException(e); @@ -314,21 +328,24 @@ public class UserApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("createUsersWithArrayInput", localVarResponse); } + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } return new ApiResponse<>( localVarResponse.statusCode(), localVarResponse.headers().map(), null ); } finally { - // Drain the InputStream - while (localVarResponse.body().read() != -1) { - // Ignore + if (localVarResponseBody != null) { + localVarResponseBody.close(); } - localVarResponse.body().close(); } } catch (IOException e) { throw new ApiException(e); @@ -420,21 +437,24 @@ public class UserApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("createUsersWithListInput", localVarResponse); } + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } return new ApiResponse<>( localVarResponse.statusCode(), localVarResponse.headers().map(), null ); } finally { - // Drain the InputStream - while (localVarResponse.body().read() != -1) { - // Ignore + if (localVarResponseBody != null) { + localVarResponseBody.close(); } - localVarResponse.body().close(); } } catch (IOException e) { throw new ApiException(e); @@ -526,21 +546,24 @@ public class UserApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("deleteUser", localVarResponse); } + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } return new ApiResponse<>( localVarResponse.statusCode(), localVarResponse.headers().map(), null ); } finally { - // Drain the InputStream - while (localVarResponse.body().read() != -1) { - // Ignore + if (localVarResponseBody != null) { + localVarResponseBody.close(); } - localVarResponse.body().close(); } } catch (IOException e) { throw new ApiException(e); @@ -630,11 +653,13 @@ public class UserApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("getUserByName", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -644,10 +669,9 @@ public class UserApi { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); User responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); - localVarResponse.body().close(); return new ApiResponse( localVarResponse.statusCode(), @@ -655,6 +679,9 @@ public class UserApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -748,11 +775,13 @@ public class UserApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("loginUser", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -762,10 +791,9 @@ public class UserApi { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); String responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); - localVarResponse.body().close(); return new ApiResponse( localVarResponse.statusCode(), @@ -773,6 +801,9 @@ public class UserApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -875,21 +906,24 @@ public class UserApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("logoutUser", localVarResponse); } + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } return new ApiResponse<>( localVarResponse.statusCode(), localVarResponse.headers().map(), null ); } finally { - // Drain the InputStream - while (localVarResponse.body().read() != -1) { - // Ignore + if (localVarResponseBody != null) { + localVarResponseBody.close(); } - localVarResponse.body().close(); } } catch (IOException e) { throw new ApiException(e); @@ -975,21 +1009,24 @@ public class UserApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("updateUser", localVarResponse); } + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } return new ApiResponse<>( localVarResponse.statusCode(), localVarResponse.headers().map(), null ); } finally { - // Drain the InputStream - while (localVarResponse.body().read() != -1) { - // Ignore + if (localVarResponseBody != null) { + localVarResponseBody.close(); } - localVarResponse.body().close(); } } catch (IOException e) { throw new ApiException(e); diff --git a/samples/client/petstore/java/native/src/main/java/org/openapitools/client/ApiClient.java b/samples/client/petstore/java/native/src/main/java/org/openapitools/client/ApiClient.java index 0caa87e1ea19..3f503b919cc4 100644 --- a/samples/client/petstore/java/native/src/main/java/org/openapitools/client/ApiClient.java +++ b/samples/client/petstore/java/native/src/main/java/org/openapitools/client/ApiClient.java @@ -20,6 +20,7 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import org.openapitools.jackson.nullable.JsonNullableModule; import java.io.InputStream; +import java.io.IOException; import java.net.URI; import java.net.URLEncoder; import java.net.http.HttpClient; @@ -34,6 +35,8 @@ import java.util.Collections; import java.util.List; import java.util.StringJoiner; import java.util.function.Consumer; +import java.util.Optional; +import java.util.zip.GZIPInputStream; import java.util.stream.Collectors; import static java.nio.charset.StandardCharsets.UTF_8; @@ -62,7 +65,7 @@ public class ApiClient { protected String basePath; protected Consumer interceptor; protected Consumer> responseInterceptor; - protected Consumer> asyncResponseInterceptor; + protected Consumer> asyncResponseInterceptor; protected Duration readTimeout; protected Duration connectTimeout; @@ -384,7 +387,7 @@ public class ApiClient { * of null resets the interceptor to a no-op. * @return This object. */ - public ApiClient setAsyncResponseInterceptor(Consumer> interceptor) { + public ApiClient setAsyncResponseInterceptor(Consumer> interceptor) { this.asyncResponseInterceptor = interceptor; return this; } @@ -394,7 +397,7 @@ public class ApiClient { * * @return The custom interceptor that was set, or null if there isn't any. */ - public Consumer> getAsyncResponseInterceptor() { + public Consumer> getAsyncResponseInterceptor() { return asyncResponseInterceptor; } @@ -454,4 +457,32 @@ public class ApiClient { public Duration getConnectTimeout() { return connectTimeout; } + + /** + * Returns the response body InputStream, transparently decoding gzip-compressed + * payloads when the server sets {@code Content-Encoding: gzip}. + * + * @param response HTTP response whose body should be consumed + * @return Original or decompressed InputStream for the response body + * @throws IOException if the response body cannot be accessed or wrapping fails + */ + public static InputStream getResponseBody(HttpResponse response) throws IOException { + if (response == null) { + return null; + } + InputStream body = response.body(); + if (body == null) { + return null; + } + Optional encoding = response.headers().firstValue("Content-Encoding"); + if (encoding.isPresent()) { + for (String token : encoding.get().split(",")) { + if ("gzip".equalsIgnoreCase(token.trim())) { + return new GZIPInputStream(body); + } + } + } + return body; + } + } diff --git a/samples/client/petstore/java/native/src/main/java/org/openapitools/client/api/AnotherFakeApi.java b/samples/client/petstore/java/native/src/main/java/org/openapitools/client/api/AnotherFakeApi.java index aab046dae655..d641a4662ad3 100644 --- a/samples/client/petstore/java/native/src/main/java/org/openapitools/client/api/AnotherFakeApi.java +++ b/samples/client/petstore/java/native/src/main/java/org/openapitools/client/api/AnotherFakeApi.java @@ -74,7 +74,7 @@ public class AnotherFakeApi { private final Consumer memberVarInterceptor; private final Duration memberVarReadTimeout; private final Consumer> memberVarResponseInterceptor; - private final Consumer> memberVarAsyncResponseInterceptor; + private final Consumer> memberVarAsyncResponseInterceptor; public AnotherFakeApi() { this(Configuration.getDefaultApiClient()); @@ -92,7 +92,15 @@ public class AnotherFakeApi { protected ApiException getApiException(String operationId, HttpResponse response) throws IOException { - String body = response.body() == null ? null : new String(response.body().readAllBytes()); + InputStream responseBody = ApiClient.getResponseBody(response); + String body = null; + try { + body = responseBody == null ? null : new String(responseBody.readAllBytes()); + } finally { + if (responseBody != null) { + responseBody.close(); + } + } String message = formatExceptionMessage(operationId, response.statusCode(), body); return new ApiException(response.statusCode(), message, response.headers(), body); } @@ -111,10 +119,13 @@ public class AnotherFakeApi { * @return File * @throws ApiException If fail to read file content from response and write to disk */ - public File downloadFileFromResponse(HttpResponse response) throws ApiException { + public File downloadFileFromResponse(HttpResponse response, InputStream responseBody) throws ApiException { + if (responseBody == null) { + throw new ApiException(new IOException("Response body is empty")); + } try { File file = prepareDownloadFile(response); - java.nio.file.Files.copy(response.body(), file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); + java.nio.file.Files.copy(responseBody, file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); return file; } catch (IOException e) { throw new ApiException(e); @@ -204,11 +215,13 @@ public class AnotherFakeApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("call123testSpecialTags", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -218,10 +231,9 @@ public class AnotherFakeApi { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); Client responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); - localVarResponse.body().close(); return new ApiResponse( localVarResponse.statusCode(), @@ -229,6 +241,9 @@ public class AnotherFakeApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); diff --git a/samples/client/petstore/java/native/src/main/java/org/openapitools/client/api/DefaultApi.java b/samples/client/petstore/java/native/src/main/java/org/openapitools/client/api/DefaultApi.java index 8b7d73330f42..ead7c4eddb43 100644 --- a/samples/client/petstore/java/native/src/main/java/org/openapitools/client/api/DefaultApi.java +++ b/samples/client/petstore/java/native/src/main/java/org/openapitools/client/api/DefaultApi.java @@ -74,7 +74,7 @@ public class DefaultApi { private final Consumer memberVarInterceptor; private final Duration memberVarReadTimeout; private final Consumer> memberVarResponseInterceptor; - private final Consumer> memberVarAsyncResponseInterceptor; + private final Consumer> memberVarAsyncResponseInterceptor; public DefaultApi() { this(Configuration.getDefaultApiClient()); @@ -92,7 +92,15 @@ public class DefaultApi { protected ApiException getApiException(String operationId, HttpResponse response) throws IOException { - String body = response.body() == null ? null : new String(response.body().readAllBytes()); + InputStream responseBody = ApiClient.getResponseBody(response); + String body = null; + try { + body = responseBody == null ? null : new String(responseBody.readAllBytes()); + } finally { + if (responseBody != null) { + responseBody.close(); + } + } String message = formatExceptionMessage(operationId, response.statusCode(), body); return new ApiException(response.statusCode(), message, response.headers(), body); } @@ -111,10 +119,13 @@ public class DefaultApi { * @return File * @throws ApiException If fail to read file content from response and write to disk */ - public File downloadFileFromResponse(HttpResponse response) throws ApiException { + public File downloadFileFromResponse(HttpResponse response, InputStream responseBody) throws ApiException { + if (responseBody == null) { + throw new ApiException(new IOException("Response body is empty")); + } try { File file = prepareDownloadFile(response); - java.nio.file.Files.copy(response.body(), file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); + java.nio.file.Files.copy(responseBody, file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); return file; } catch (IOException e) { throw new ApiException(e); @@ -200,11 +211,13 @@ public class DefaultApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("fooGet", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -214,10 +227,9 @@ public class DefaultApi { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); FooGetDefaultResponse responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); - localVarResponse.body().close(); return new ApiResponse( localVarResponse.statusCode(), @@ -225,6 +237,9 @@ public class DefaultApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); diff --git a/samples/client/petstore/java/native/src/main/java/org/openapitools/client/api/FakeApi.java b/samples/client/petstore/java/native/src/main/java/org/openapitools/client/api/FakeApi.java index 4e7fc938fe20..3d86e3ca616e 100644 --- a/samples/client/petstore/java/native/src/main/java/org/openapitools/client/api/FakeApi.java +++ b/samples/client/petstore/java/native/src/main/java/org/openapitools/client/api/FakeApi.java @@ -91,7 +91,7 @@ public class FakeApi { private final Consumer memberVarInterceptor; private final Duration memberVarReadTimeout; private final Consumer> memberVarResponseInterceptor; - private final Consumer> memberVarAsyncResponseInterceptor; + private final Consumer> memberVarAsyncResponseInterceptor; public FakeApi() { this(Configuration.getDefaultApiClient()); @@ -109,7 +109,15 @@ public class FakeApi { protected ApiException getApiException(String operationId, HttpResponse response) throws IOException { - String body = response.body() == null ? null : new String(response.body().readAllBytes()); + InputStream responseBody = ApiClient.getResponseBody(response); + String body = null; + try { + body = responseBody == null ? null : new String(responseBody.readAllBytes()); + } finally { + if (responseBody != null) { + responseBody.close(); + } + } String message = formatExceptionMessage(operationId, response.statusCode(), body); return new ApiException(response.statusCode(), message, response.headers(), body); } @@ -128,10 +136,13 @@ public class FakeApi { * @return File * @throws ApiException If fail to read file content from response and write to disk */ - public File downloadFileFromResponse(HttpResponse response) throws ApiException { + public File downloadFileFromResponse(HttpResponse response, InputStream responseBody) throws ApiException { + if (responseBody == null) { + throw new ApiException(new IOException("Response body is empty")); + } try { File file = prepareDownloadFile(response); - java.nio.file.Files.copy(response.body(), file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); + java.nio.file.Files.copy(responseBody, file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); return file; } catch (IOException e) { throw new ApiException(e); @@ -217,11 +228,13 @@ public class FakeApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("fakeBigDecimalMap", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -231,10 +244,9 @@ public class FakeApi { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); FakeBigDecimalMap200Response responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); - localVarResponse.body().close(); return new ApiResponse( localVarResponse.statusCode(), @@ -242,6 +254,9 @@ public class FakeApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -322,11 +337,13 @@ public class FakeApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("fakeHealthGet", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -336,10 +353,9 @@ public class FakeApi { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); HealthCheckResult responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); - localVarResponse.body().close(); return new ApiResponse( localVarResponse.statusCode(), @@ -347,6 +363,9 @@ public class FakeApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -431,11 +450,13 @@ public class FakeApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("fakeOuterBooleanSerialize", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -445,10 +466,9 @@ public class FakeApi { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); Boolean responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); - localVarResponse.body().close(); return new ApiResponse( localVarResponse.statusCode(), @@ -456,6 +476,9 @@ public class FakeApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -546,11 +569,13 @@ public class FakeApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("fakeOuterCompositeSerialize", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -560,10 +585,9 @@ public class FakeApi { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); OuterComposite responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); - localVarResponse.body().close(); return new ApiResponse( localVarResponse.statusCode(), @@ -571,6 +595,9 @@ public class FakeApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -661,11 +688,13 @@ public class FakeApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("fakeOuterNumberSerialize", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -675,10 +704,9 @@ public class FakeApi { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); BigDecimal responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); - localVarResponse.body().close(); return new ApiResponse( localVarResponse.statusCode(), @@ -686,6 +714,9 @@ public class FakeApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -776,11 +807,13 @@ public class FakeApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("fakeOuterStringSerialize", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -790,10 +823,9 @@ public class FakeApi { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); String responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); - localVarResponse.body().close(); return new ApiResponse( localVarResponse.statusCode(), @@ -801,6 +833,9 @@ public class FakeApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -882,11 +917,13 @@ public class FakeApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("getApplicationJsonUtf8", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse>( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -896,10 +933,9 @@ public class FakeApi { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); List responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference>() {}); - localVarResponse.body().close(); return new ApiResponse>( localVarResponse.statusCode(), @@ -907,6 +943,9 @@ public class FakeApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -987,11 +1026,13 @@ public class FakeApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("getArrayOfEnums", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse>( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -1001,10 +1042,9 @@ public class FakeApi { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); List responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference>() {}); - localVarResponse.body().close(); return new ApiResponse>( localVarResponse.statusCode(), @@ -1012,6 +1052,9 @@ public class FakeApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -1093,21 +1136,24 @@ public class FakeApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testAdditionalPropertiesReference", localVarResponse); } + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } return new ApiResponse<>( localVarResponse.statusCode(), localVarResponse.headers().map(), null ); } finally { - // Drain the InputStream - while (localVarResponse.body().read() != -1) { - // Ignore + if (localVarResponseBody != null) { + localVarResponseBody.close(); } - localVarResponse.body().close(); } } catch (IOException e) { throw new ApiException(e); @@ -1199,21 +1245,24 @@ public class FakeApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testBodyWithFileSchema", localVarResponse); } + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } return new ApiResponse<>( localVarResponse.statusCode(), localVarResponse.headers().map(), null ); } finally { - // Drain the InputStream - while (localVarResponse.body().read() != -1) { - // Ignore + if (localVarResponseBody != null) { + localVarResponseBody.close(); } - localVarResponse.body().close(); } } catch (IOException e) { throw new ApiException(e); @@ -1309,21 +1358,24 @@ public class FakeApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testBodyWithQueryParams", localVarResponse); } + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } return new ApiResponse<>( localVarResponse.statusCode(), localVarResponse.headers().map(), null ); } finally { - // Drain the InputStream - while (localVarResponse.body().read() != -1) { - // Ignore + if (localVarResponseBody != null) { + localVarResponseBody.close(); } - localVarResponse.body().close(); } } catch (IOException e) { throw new ApiException(e); @@ -1437,11 +1489,13 @@ public class FakeApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testClientModel", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -1451,10 +1505,9 @@ public class FakeApi { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); Client responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); - localVarResponse.body().close(); return new ApiResponse( localVarResponse.statusCode(), @@ -1462,6 +1515,9 @@ public class FakeApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -1605,21 +1661,24 @@ public class FakeApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testEndpointParameters", localVarResponse); } + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } return new ApiResponse<>( localVarResponse.statusCode(), localVarResponse.headers().map(), null ); } finally { - // Drain the InputStream - while (localVarResponse.body().read() != -1) { - // Ignore + if (localVarResponseBody != null) { + localVarResponseBody.close(); } - localVarResponse.body().close(); } } catch (IOException e) { throw new ApiException(e); @@ -1706,10 +1765,11 @@ public class FakeApi { } catch (IOException e) { throw new RuntimeException(e); } + byte[] formBytes = formOutputStream.toByteArray(); localVarRequestBuilder .header("Content-Type", entity.getContentType().getValue()) .method("POST", HttpRequest.BodyPublishers - .ofInputStream(() -> new ByteArrayInputStream(formOutputStream.toByteArray()))); + .ofInputStream(() -> new ByteArrayInputStream(formBytes))); if (memberVarReadTimeout != null) { localVarRequestBuilder.timeout(memberVarReadTimeout); } @@ -1798,21 +1858,24 @@ public class FakeApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testEnumParameters", localVarResponse); } + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } return new ApiResponse<>( localVarResponse.statusCode(), localVarResponse.headers().map(), null ); } finally { - // Drain the InputStream - while (localVarResponse.body().read() != -1) { - // Ignore + if (localVarResponseBody != null) { + localVarResponseBody.close(); } - localVarResponse.body().close(); } } catch (IOException e) { throw new ApiException(e); @@ -1876,10 +1939,11 @@ public class FakeApi { } catch (IOException e) { throw new RuntimeException(e); } + byte[] formBytes = formOutputStream.toByteArray(); localVarRequestBuilder .header("Content-Type", entity.getContentType().getValue()) .method("GET", HttpRequest.BodyPublishers - .ofInputStream(() -> new ByteArrayInputStream(formOutputStream.toByteArray()))); + .ofInputStream(() -> new ByteArrayInputStream(formBytes))); if (memberVarReadTimeout != null) { localVarRequestBuilder.timeout(memberVarReadTimeout); } @@ -2022,21 +2086,24 @@ public class FakeApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testGroupParameters", localVarResponse); } + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } return new ApiResponse<>( localVarResponse.statusCode(), localVarResponse.headers().map(), null ); } finally { - // Drain the InputStream - while (localVarResponse.body().read() != -1) { - // Ignore + if (localVarResponseBody != null) { + localVarResponseBody.close(); } - localVarResponse.body().close(); } } catch (IOException e) { throw new ApiException(e); @@ -2246,21 +2313,24 @@ public class FakeApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testInlineAdditionalProperties", localVarResponse); } + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } return new ApiResponse<>( localVarResponse.statusCode(), localVarResponse.headers().map(), null ); } finally { - // Drain the InputStream - while (localVarResponse.body().read() != -1) { - // Ignore + if (localVarResponseBody != null) { + localVarResponseBody.close(); } - localVarResponse.body().close(); } } catch (IOException e) { throw new ApiException(e); @@ -2352,21 +2422,24 @@ public class FakeApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testInlineFreeformAdditionalProperties", localVarResponse); } + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } return new ApiResponse<>( localVarResponse.statusCode(), localVarResponse.headers().map(), null ); } finally { - // Drain the InputStream - while (localVarResponse.body().read() != -1) { - // Ignore + if (localVarResponseBody != null) { + localVarResponseBody.close(); } - localVarResponse.body().close(); } } catch (IOException e) { throw new ApiException(e); @@ -2462,21 +2535,24 @@ public class FakeApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testJsonFormData", localVarResponse); } + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } return new ApiResponse<>( localVarResponse.statusCode(), localVarResponse.headers().map(), null ); } finally { - // Drain the InputStream - while (localVarResponse.body().read() != -1) { - // Ignore + if (localVarResponseBody != null) { + localVarResponseBody.close(); } - localVarResponse.body().close(); } } catch (IOException e) { throw new ApiException(e); @@ -2519,10 +2595,11 @@ public class FakeApi { } catch (IOException e) { throw new RuntimeException(e); } + byte[] formBytes = formOutputStream.toByteArray(); localVarRequestBuilder .header("Content-Type", entity.getContentType().getValue()) .method("GET", HttpRequest.BodyPublishers - .ofInputStream(() -> new ByteArrayInputStream(formOutputStream.toByteArray()))); + .ofInputStream(() -> new ByteArrayInputStream(formBytes))); if (memberVarReadTimeout != null) { localVarRequestBuilder.timeout(memberVarReadTimeout); } @@ -2599,21 +2676,24 @@ public class FakeApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testQueryParameterCollectionFormat", localVarResponse); } + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } return new ApiResponse<>( localVarResponse.statusCode(), localVarResponse.headers().map(), null ); } finally { - // Drain the InputStream - while (localVarResponse.body().read() != -1) { - // Ignore + if (localVarResponseBody != null) { + localVarResponseBody.close(); } - localVarResponse.body().close(); } } catch (IOException e) { throw new ApiException(e); @@ -2738,21 +2818,24 @@ public class FakeApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testStringMapReference", localVarResponse); } + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } return new ApiResponse<>( localVarResponse.statusCode(), localVarResponse.headers().map(), null ); } finally { - // Drain the InputStream - while (localVarResponse.body().read() != -1) { - // Ignore + if (localVarResponseBody != null) { + localVarResponseBody.close(); } - localVarResponse.body().close(); } } catch (IOException e) { throw new ApiException(e); diff --git a/samples/client/petstore/java/native/src/main/java/org/openapitools/client/api/FakeClassnameTags123Api.java b/samples/client/petstore/java/native/src/main/java/org/openapitools/client/api/FakeClassnameTags123Api.java index 378f0acb75b8..45959c76a8d8 100644 --- a/samples/client/petstore/java/native/src/main/java/org/openapitools/client/api/FakeClassnameTags123Api.java +++ b/samples/client/petstore/java/native/src/main/java/org/openapitools/client/api/FakeClassnameTags123Api.java @@ -80,7 +80,7 @@ public class FakeClassnameTags123Api { private final Consumer memberVarInterceptor; private final Duration memberVarReadTimeout; private final Consumer> memberVarResponseInterceptor; - private final Consumer> memberVarAsyncResponseInterceptor; + private final Consumer> memberVarAsyncResponseInterceptor; public FakeClassnameTags123Api() { this(Configuration.getDefaultApiClient()); @@ -98,7 +98,15 @@ public class FakeClassnameTags123Api { protected ApiException getApiException(String operationId, HttpResponse response) throws IOException { - String body = response.body() == null ? null : new String(response.body().readAllBytes()); + InputStream responseBody = ApiClient.getResponseBody(response); + String body = null; + try { + body = responseBody == null ? null : new String(responseBody.readAllBytes()); + } finally { + if (responseBody != null) { + responseBody.close(); + } + } String message = formatExceptionMessage(operationId, response.statusCode(), body); return new ApiException(response.statusCode(), message, response.headers(), body); } @@ -117,10 +125,13 @@ public class FakeClassnameTags123Api { * @return File * @throws ApiException If fail to read file content from response and write to disk */ - public File downloadFileFromResponse(HttpResponse response) throws ApiException { + public File downloadFileFromResponse(HttpResponse response, InputStream responseBody) throws ApiException { + if (responseBody == null) { + throw new ApiException(new IOException("Response body is empty")); + } try { File file = prepareDownloadFile(response); - java.nio.file.Files.copy(response.body(), file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); + java.nio.file.Files.copy(responseBody, file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); return file; } catch (IOException e) { throw new ApiException(e); @@ -210,11 +221,13 @@ public class FakeClassnameTags123Api { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testClassname", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -224,10 +237,9 @@ public class FakeClassnameTags123Api { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); Client responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); - localVarResponse.body().close(); return new ApiResponse( localVarResponse.statusCode(), @@ -235,6 +247,9 @@ public class FakeClassnameTags123Api { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); diff --git a/samples/client/petstore/java/native/src/main/java/org/openapitools/client/api/PetApi.java b/samples/client/petstore/java/native/src/main/java/org/openapitools/client/api/PetApi.java index 69948b44da63..74529ccbf514 100644 --- a/samples/client/petstore/java/native/src/main/java/org/openapitools/client/api/PetApi.java +++ b/samples/client/petstore/java/native/src/main/java/org/openapitools/client/api/PetApi.java @@ -82,7 +82,7 @@ public class PetApi { private final Consumer memberVarInterceptor; private final Duration memberVarReadTimeout; private final Consumer> memberVarResponseInterceptor; - private final Consumer> memberVarAsyncResponseInterceptor; + private final Consumer> memberVarAsyncResponseInterceptor; public PetApi() { this(Configuration.getDefaultApiClient()); @@ -100,7 +100,15 @@ public class PetApi { protected ApiException getApiException(String operationId, HttpResponse response) throws IOException { - String body = response.body() == null ? null : new String(response.body().readAllBytes()); + InputStream responseBody = ApiClient.getResponseBody(response); + String body = null; + try { + body = responseBody == null ? null : new String(responseBody.readAllBytes()); + } finally { + if (responseBody != null) { + responseBody.close(); + } + } String message = formatExceptionMessage(operationId, response.statusCode(), body); return new ApiException(response.statusCode(), message, response.headers(), body); } @@ -119,10 +127,13 @@ public class PetApi { * @return File * @throws ApiException If fail to read file content from response and write to disk */ - public File downloadFileFromResponse(HttpResponse response) throws ApiException { + public File downloadFileFromResponse(HttpResponse response, InputStream responseBody) throws ApiException { + if (responseBody == null) { + throw new ApiException(new IOException("Response body is empty")); + } try { File file = prepareDownloadFile(response); - java.nio.file.Files.copy(response.body(), file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); + java.nio.file.Files.copy(responseBody, file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); return file; } catch (IOException e) { throw new ApiException(e); @@ -209,21 +220,24 @@ public class PetApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("addPet", localVarResponse); } + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } return new ApiResponse<>( localVarResponse.statusCode(), localVarResponse.headers().map(), null ); } finally { - // Drain the InputStream - while (localVarResponse.body().read() != -1) { - // Ignore + if (localVarResponseBody != null) { + localVarResponseBody.close(); } - localVarResponse.body().close(); } } catch (IOException e) { throw new ApiException(e); @@ -319,21 +333,24 @@ public class PetApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("deletePet", localVarResponse); } + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } return new ApiResponse<>( localVarResponse.statusCode(), localVarResponse.headers().map(), null ); } finally { - // Drain the InputStream - while (localVarResponse.body().read() != -1) { - // Ignore + if (localVarResponseBody != null) { + localVarResponseBody.close(); } - localVarResponse.body().close(); } } catch (IOException e) { throw new ApiException(e); @@ -426,11 +443,13 @@ public class PetApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("findPetsByStatus", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse>( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -440,10 +459,9 @@ public class PetApi { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); List responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference>() {}); - localVarResponse.body().close(); return new ApiResponse>( localVarResponse.statusCode(), @@ -451,6 +469,9 @@ public class PetApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -562,11 +583,13 @@ public class PetApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("findPetsByTags", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse>( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -576,10 +599,9 @@ public class PetApi { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); List responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference>() {}); - localVarResponse.body().close(); return new ApiResponse>( localVarResponse.statusCode(), @@ -587,6 +609,9 @@ public class PetApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -690,11 +715,13 @@ public class PetApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("getPetById", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -704,10 +731,9 @@ public class PetApi { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); Pet responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); - localVarResponse.body().close(); return new ApiResponse( localVarResponse.statusCode(), @@ -715,6 +741,9 @@ public class PetApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -801,21 +830,24 @@ public class PetApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("updatePet", localVarResponse); } + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } return new ApiResponse<>( localVarResponse.statusCode(), localVarResponse.headers().map(), null ); } finally { - // Drain the InputStream - while (localVarResponse.body().read() != -1) { - // Ignore + if (localVarResponseBody != null) { + localVarResponseBody.close(); } - localVarResponse.body().close(); } } catch (IOException e) { throw new ApiException(e); @@ -915,21 +947,24 @@ public class PetApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("updatePetWithForm", localVarResponse); } + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } return new ApiResponse<>( localVarResponse.statusCode(), localVarResponse.headers().map(), null ); } finally { - // Drain the InputStream - while (localVarResponse.body().read() != -1) { - // Ignore + if (localVarResponseBody != null) { + localVarResponseBody.close(); } - localVarResponse.body().close(); } } catch (IOException e) { throw new ApiException(e); @@ -969,10 +1004,11 @@ public class PetApi { } catch (IOException e) { throw new RuntimeException(e); } + byte[] formBytes = formOutputStream.toByteArray(); localVarRequestBuilder .header("Content-Type", entity.getContentType().getValue()) .method("POST", HttpRequest.BodyPublishers - .ofInputStream(() -> new ByteArrayInputStream(formOutputStream.toByteArray()))); + .ofInputStream(() -> new ByteArrayInputStream(formBytes))); if (memberVarReadTimeout != null) { localVarRequestBuilder.timeout(memberVarReadTimeout); } @@ -1044,11 +1080,13 @@ public class PetApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("uploadFile", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -1058,10 +1096,9 @@ public class PetApi { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); ModelApiResponse responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); - localVarResponse.body().close(); return new ApiResponse( localVarResponse.statusCode(), @@ -1069,6 +1106,9 @@ public class PetApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -1125,8 +1165,9 @@ public class PetApi { } catch (IOException e) { throw new RuntimeException(e); } + byte[] formBytes = formOutputStream.toByteArray(); formDataPublisher = HttpRequest.BodyPublishers - .ofInputStream(() -> new ByteArrayInputStream(formOutputStream.toByteArray())); + .ofInputStream(() -> new ByteArrayInputStream(formBytes)); } localVarRequestBuilder .header("Content-Type", entity.getContentType().getValue()) @@ -1202,11 +1243,13 @@ public class PetApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("uploadFileWithRequiredFile", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -1216,10 +1259,9 @@ public class PetApi { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); ModelApiResponse responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); - localVarResponse.body().close(); return new ApiResponse( localVarResponse.statusCode(), @@ -1227,6 +1269,9 @@ public class PetApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -1287,8 +1332,9 @@ public class PetApi { } catch (IOException e) { throw new RuntimeException(e); } + byte[] formBytes = formOutputStream.toByteArray(); formDataPublisher = HttpRequest.BodyPublishers - .ofInputStream(() -> new ByteArrayInputStream(formOutputStream.toByteArray())); + .ofInputStream(() -> new ByteArrayInputStream(formBytes)); } localVarRequestBuilder .header("Content-Type", entity.getContentType().getValue()) diff --git a/samples/client/petstore/java/native/src/main/java/org/openapitools/client/api/StoreApi.java b/samples/client/petstore/java/native/src/main/java/org/openapitools/client/api/StoreApi.java index 0574453d4da5..8192c66dbfd8 100644 --- a/samples/client/petstore/java/native/src/main/java/org/openapitools/client/api/StoreApi.java +++ b/samples/client/petstore/java/native/src/main/java/org/openapitools/client/api/StoreApi.java @@ -80,7 +80,7 @@ public class StoreApi { private final Consumer memberVarInterceptor; private final Duration memberVarReadTimeout; private final Consumer> memberVarResponseInterceptor; - private final Consumer> memberVarAsyncResponseInterceptor; + private final Consumer> memberVarAsyncResponseInterceptor; public StoreApi() { this(Configuration.getDefaultApiClient()); @@ -98,7 +98,15 @@ public class StoreApi { protected ApiException getApiException(String operationId, HttpResponse response) throws IOException { - String body = response.body() == null ? null : new String(response.body().readAllBytes()); + InputStream responseBody = ApiClient.getResponseBody(response); + String body = null; + try { + body = responseBody == null ? null : new String(responseBody.readAllBytes()); + } finally { + if (responseBody != null) { + responseBody.close(); + } + } String message = formatExceptionMessage(operationId, response.statusCode(), body); return new ApiException(response.statusCode(), message, response.headers(), body); } @@ -117,10 +125,13 @@ public class StoreApi { * @return File * @throws ApiException If fail to read file content from response and write to disk */ - public File downloadFileFromResponse(HttpResponse response) throws ApiException { + public File downloadFileFromResponse(HttpResponse response, InputStream responseBody) throws ApiException { + if (responseBody == null) { + throw new ApiException(new IOException("Response body is empty")); + } try { File file = prepareDownloadFile(response); - java.nio.file.Files.copy(response.body(), file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); + java.nio.file.Files.copy(responseBody, file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); return file; } catch (IOException e) { throw new ApiException(e); @@ -207,21 +218,24 @@ public class StoreApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("deleteOrder", localVarResponse); } + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } return new ApiResponse<>( localVarResponse.statusCode(), localVarResponse.headers().map(), null ); } finally { - // Drain the InputStream - while (localVarResponse.body().read() != -1) { - // Ignore + if (localVarResponseBody != null) { + localVarResponseBody.close(); } - localVarResponse.body().close(); } } catch (IOException e) { throw new ApiException(e); @@ -307,11 +321,13 @@ public class StoreApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("getInventory", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse>( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -321,10 +337,9 @@ public class StoreApi { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); Map responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference>() {}); - localVarResponse.body().close(); return new ApiResponse>( localVarResponse.statusCode(), @@ -332,6 +347,9 @@ public class StoreApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -416,11 +434,13 @@ public class StoreApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("getOrderById", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -430,10 +450,9 @@ public class StoreApi { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); Order responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); - localVarResponse.body().close(); return new ApiResponse( localVarResponse.statusCode(), @@ -441,6 +460,9 @@ public class StoreApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -530,11 +552,13 @@ public class StoreApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("placeOrder", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -544,10 +568,9 @@ public class StoreApi { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); Order responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); - localVarResponse.body().close(); return new ApiResponse( localVarResponse.statusCode(), @@ -555,6 +578,9 @@ public class StoreApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); diff --git a/samples/client/petstore/java/native/src/main/java/org/openapitools/client/api/UserApi.java b/samples/client/petstore/java/native/src/main/java/org/openapitools/client/api/UserApi.java index ad718b842a40..5e8ac868ed7b 100644 --- a/samples/client/petstore/java/native/src/main/java/org/openapitools/client/api/UserApi.java +++ b/samples/client/petstore/java/native/src/main/java/org/openapitools/client/api/UserApi.java @@ -81,7 +81,7 @@ public class UserApi { private final Consumer memberVarInterceptor; private final Duration memberVarReadTimeout; private final Consumer> memberVarResponseInterceptor; - private final Consumer> memberVarAsyncResponseInterceptor; + private final Consumer> memberVarAsyncResponseInterceptor; public UserApi() { this(Configuration.getDefaultApiClient()); @@ -99,7 +99,15 @@ public class UserApi { protected ApiException getApiException(String operationId, HttpResponse response) throws IOException { - String body = response.body() == null ? null : new String(response.body().readAllBytes()); + InputStream responseBody = ApiClient.getResponseBody(response); + String body = null; + try { + body = responseBody == null ? null : new String(responseBody.readAllBytes()); + } finally { + if (responseBody != null) { + responseBody.close(); + } + } String message = formatExceptionMessage(operationId, response.statusCode(), body); return new ApiException(response.statusCode(), message, response.headers(), body); } @@ -118,10 +126,13 @@ public class UserApi { * @return File * @throws ApiException If fail to read file content from response and write to disk */ - public File downloadFileFromResponse(HttpResponse response) throws ApiException { + public File downloadFileFromResponse(HttpResponse response, InputStream responseBody) throws ApiException { + if (responseBody == null) { + throw new ApiException(new IOException("Response body is empty")); + } try { File file = prepareDownloadFile(response); - java.nio.file.Files.copy(response.body(), file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); + java.nio.file.Files.copy(responseBody, file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); return file; } catch (IOException e) { throw new ApiException(e); @@ -208,21 +219,24 @@ public class UserApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("createUser", localVarResponse); } + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } return new ApiResponse<>( localVarResponse.statusCode(), localVarResponse.headers().map(), null ); } finally { - // Drain the InputStream - while (localVarResponse.body().read() != -1) { - // Ignore + if (localVarResponseBody != null) { + localVarResponseBody.close(); } - localVarResponse.body().close(); } } catch (IOException e) { throw new ApiException(e); @@ -314,21 +328,24 @@ public class UserApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("createUsersWithArrayInput", localVarResponse); } + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } return new ApiResponse<>( localVarResponse.statusCode(), localVarResponse.headers().map(), null ); } finally { - // Drain the InputStream - while (localVarResponse.body().read() != -1) { - // Ignore + if (localVarResponseBody != null) { + localVarResponseBody.close(); } - localVarResponse.body().close(); } } catch (IOException e) { throw new ApiException(e); @@ -420,21 +437,24 @@ public class UserApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("createUsersWithListInput", localVarResponse); } + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } return new ApiResponse<>( localVarResponse.statusCode(), localVarResponse.headers().map(), null ); } finally { - // Drain the InputStream - while (localVarResponse.body().read() != -1) { - // Ignore + if (localVarResponseBody != null) { + localVarResponseBody.close(); } - localVarResponse.body().close(); } } catch (IOException e) { throw new ApiException(e); @@ -526,21 +546,24 @@ public class UserApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("deleteUser", localVarResponse); } + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } return new ApiResponse<>( localVarResponse.statusCode(), localVarResponse.headers().map(), null ); } finally { - // Drain the InputStream - while (localVarResponse.body().read() != -1) { - // Ignore + if (localVarResponseBody != null) { + localVarResponseBody.close(); } - localVarResponse.body().close(); } } catch (IOException e) { throw new ApiException(e); @@ -630,11 +653,13 @@ public class UserApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("getUserByName", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -644,10 +669,9 @@ public class UserApi { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); User responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); - localVarResponse.body().close(); return new ApiResponse( localVarResponse.statusCode(), @@ -655,6 +679,9 @@ public class UserApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -748,11 +775,13 @@ public class UserApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("loginUser", localVarResponse); } - if (localVarResponse.body() == null) { + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody == null) { return new ApiResponse( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -762,10 +791,9 @@ public class UserApi { - String responseBody = new String(localVarResponse.body().readAllBytes()); + String responseBody = new String(localVarResponseBody.readAllBytes()); String responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference() {}); - localVarResponse.body().close(); return new ApiResponse( localVarResponse.statusCode(), @@ -773,6 +801,9 @@ public class UserApi { responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -875,21 +906,24 @@ public class UserApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("logoutUser", localVarResponse); } + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } return new ApiResponse<>( localVarResponse.statusCode(), localVarResponse.headers().map(), null ); } finally { - // Drain the InputStream - while (localVarResponse.body().read() != -1) { - // Ignore + if (localVarResponseBody != null) { + localVarResponseBody.close(); } - localVarResponse.body().close(); } } catch (IOException e) { throw new ApiException(e); @@ -975,21 +1009,24 @@ public class UserApi { if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("updateUser", localVarResponse); } + localVarResponseBody = ApiClient.getResponseBody(localVarResponse); + if (localVarResponseBody != null) { + localVarResponseBody.readAllBytes(); + } return new ApiResponse<>( localVarResponse.statusCode(), localVarResponse.headers().map(), null ); } finally { - // Drain the InputStream - while (localVarResponse.body().read() != -1) { - // Ignore + if (localVarResponseBody != null) { + localVarResponseBody.close(); } - localVarResponse.body().close(); } } catch (IOException e) { throw new ApiException(e);