From 929d77ee06d2474392a7be728346f0e861411193 Mon Sep 17 00:00:00 2001 From: Ilya Nemtsev Date: Sat, 15 Nov 2025 12:58:33 +0700 Subject: [PATCH 1/4] add gzip capability --- .../Java/libraries/native/ApiClient.mustache | 140 ++++++++++- .../Java/libraries/native/api.mustache | 230 +++++++++++++----- 2 files changed, 310 insertions(+), 60 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..091bc10babe0 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,127 @@ public class ApiClient { public Duration getConnectTimeout() { return connectTimeout; } + + 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}} + 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}} From aed3f1f0989420cdc67349296d475663b904cbfe Mon Sep 17 00:00:00 2001 From: Ilya Nemtsev Date: Sat, 15 Nov 2025 13:56:24 +0700 Subject: [PATCH 2/4] fixed test --- .../codegen/java/JavaClientCodegenTest.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) 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 void callNativeServiceWithEmptyResponseSync() throws IOException { 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 void callNativeServiceWithEmptyResponseAsync() throws IOException { 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() {})" ); } From 4d20a06dcb5cb958fefb82f4f3d10c203836792c Mon Sep 17 00:00:00 2001 From: Ilya Nemtsev Date: Sat, 15 Nov 2025 14:07:13 +0700 Subject: [PATCH 3/4] added docstring --- .../Java/libraries/native/ApiClient.mustache | 15 +++++++++++++++ 1 file changed, 15 insertions(+) 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 091bc10babe0..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 @@ -460,6 +460,14 @@ public class ApiClient { 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; @@ -480,6 +488,13 @@ public class ApiClient { } {{#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)); From d434b5c065b8d0e1c538e14bad07c8707718e4e1 Mon Sep 17 00:00:00 2001 From: Ilya Nemtsev Date: Sat, 15 Nov 2025 14:12:42 +0700 Subject: [PATCH 4/4] regenerated samples --- .../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 ++- 27 files changed, 2289 insertions(+), 1210 deletions(-) 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 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.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 Consumer> getResponseInterceptor() { * 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 ApiClient setAsyncResponseInterceptor(Consumer> inte * * @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 ApiClient setConnectTimeout(Duration connectTimeout) { 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 @@ static HttpRequest.Builder withAdditionalHeaders(HttpRequest.Builder builder, Ma 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 AuthApi(ApiClient apiClient) { 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 @@ private String formatExceptionMessage(String operationId, int statusCode, String * @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 ApiResponse testAuthHttpBasicWithHttpInfo(Map hea if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testAuthHttpBasic", localVarResponse); @@ -206,7 +218,8 @@ public ApiResponse testAuthHttpBasicWithHttpInfo(Map hea // 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 ApiResponse testAuthHttpBasicWithHttpInfo(Map hea 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 ApiResponse testAuthHttpBearerWithHttpInfo(Map he if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testAuthHttpBearer", localVarResponse); @@ -304,7 +321,8 @@ public ApiResponse testAuthHttpBearerWithHttpInfo(Map he // 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 ApiResponse testAuthHttpBearerWithHttpInfo(Map he 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 @@ static HttpRequest.Builder withAdditionalHeaders(HttpRequest.Builder builder, Ma 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 BodyApi(ApiClient apiClient) { 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 @@ private String formatExceptionMessage(String operationId, int statusCode, String * @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 ApiResponse testBinaryGifWithHttpInfo(Map headers) 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 ApiResponse testBinaryGifWithHttpInfo(Map headers) // 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 ApiResponse testBinaryGifWithHttpInfo(Map headers) responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -317,6 +332,7 @@ public ApiResponse testBodyApplicationOctetstreamBinaryWithHttpInfo(@jav if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testBodyApplicationOctetstreamBinary", localVarResponse); @@ -324,7 +340,8 @@ public ApiResponse testBodyApplicationOctetstreamBinaryWithHttpInfo(@jav // 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 ApiResponse testBodyApplicationOctetstreamBinaryWithHttpInfo(@jav 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 ApiResponse testBodyMultipartFormdataArrayOfBinaryWithHttpInfo(@j if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testBodyMultipartFormdataArrayOfBinary", localVarResponse); @@ -432,7 +453,8 @@ public ApiResponse testBodyMultipartFormdataArrayOfBinaryWithHttpInfo(@j // 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 ApiResponse testBodyMultipartFormdataArrayOfBinaryWithHttpInfo(@j 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 @@ private HttpRequest.Builder testBodyMultipartFormdataArrayOfBinaryRequestBuilder } 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 ApiResponse testBodyMultipartFormdataSingleBinaryWithHttpInfo(@ja if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testBodyMultipartFormdataSingleBinary", localVarResponse); @@ -573,7 +600,8 @@ public ApiResponse testBodyMultipartFormdataSingleBinaryWithHttpInfo(@ja // 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 ApiResponse testBodyMultipartFormdataSingleBinaryWithHttpInfo(@ja 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 @@ private HttpRequest.Builder testBodyMultipartFormdataSingleBinaryRequestBuilder( } 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 ApiResponse testEchoBodyAllOfPetWithHttpInfo(@javax.annotation.Nulla 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 ApiResponse testEchoBodyAllOfPetWithHttpInfo(@javax.annotation.Nulla - 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 ApiResponse testEchoBodyAllOfPetWithHttpInfo(@javax.annotation.Nulla responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -816,6 +852,7 @@ public ApiResponse testEchoBodyFreeFormObjectResponseStringWithHttpInfo( if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testEchoBodyFreeFormObjectResponseString", localVarResponse); @@ -823,7 +860,8 @@ public ApiResponse testEchoBodyFreeFormObjectResponseStringWithHttpInfo( // 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 ApiResponse testEchoBodyFreeFormObjectResponseStringWithHttpInfo( 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 ApiResponse testEchoBodyPetWithHttpInfo(@javax.annotation.Nullable P 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 ApiResponse testEchoBodyPetWithHttpInfo(@javax.annotation.Nullable P - 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 ApiResponse testEchoBodyPetWithHttpInfo(@javax.annotation.Nullable P responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -1039,6 +1084,7 @@ public ApiResponse testEchoBodyPetResponseStringWithHttpInfo(@javax.anno if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testEchoBodyPetResponseString", localVarResponse); @@ -1046,7 +1092,8 @@ public ApiResponse testEchoBodyPetResponseStringWithHttpInfo(@javax.anno // 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 ApiResponse testEchoBodyPetResponseStringWithHttpInfo(@javax.anno 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 ApiResponse testEchoBodyStringEnumWithHttpInfo(@javax.anno 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 ApiResponse testEchoBodyStringEnumWithHttpInfo(@javax.anno - 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 ApiResponse testEchoBodyStringEnumWithHttpInfo(@javax.anno responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -1262,6 +1316,7 @@ public ApiResponse testEchoBodyTagResponseStringWithHttpInfo(@javax.anno if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testEchoBodyTagResponseString", localVarResponse); @@ -1269,7 +1324,8 @@ public ApiResponse testEchoBodyTagResponseStringWithHttpInfo(@javax.anno // 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 ApiResponse testEchoBodyTagResponseStringWithHttpInfo(@javax.anno 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 @@ static HttpRequest.Builder withAdditionalHeaders(HttpRequest.Builder builder, Ma 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 FormApi(ApiClient apiClient) { 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 @@ private String formatExceptionMessage(String operationId, int statusCode, String * @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 ApiResponse testFormIntegerBooleanStringWithHttpInfo(@javax.annot if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testFormIntegerBooleanString", localVarResponse); @@ -225,7 +237,8 @@ public ApiResponse testFormIntegerBooleanStringWithHttpInfo(@javax.annot // 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 ApiResponse testFormIntegerBooleanStringWithHttpInfo(@javax.annot 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 @@ private HttpRequest.Builder testFormIntegerBooleanStringRequestBuilder(@javax.an } 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 ApiResponse testFormObjectMultipartWithHttpInfo(@javax.annotation if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testFormObjectMultipart", localVarResponse); @@ -347,7 +365,8 @@ public ApiResponse testFormObjectMultipartWithHttpInfo(@javax.annotation // 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 ApiResponse testFormObjectMultipartWithHttpInfo(@javax.annotation 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 @@ private HttpRequest.Builder testFormObjectMultipartRequestBuilder(@javax.annotat } 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 ApiResponse testFormOneofWithHttpInfo(@javax.annotation.Nullable if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testFormOneof", localVarResponse); @@ -507,7 +531,8 @@ public ApiResponse testFormOneofWithHttpInfo(@javax.annotation.Nullable // 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 ApiResponse testFormOneofWithHttpInfo(@javax.annotation.Nullable 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 @@ private HttpRequest.Builder testFormOneofRequestBuilder(@javax.annotation.Nullab } 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 @@ static HttpRequest.Builder withAdditionalHeaders(HttpRequest.Builder builder, Ma 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 HeaderApi(ApiClient apiClient) { 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 @@ private String formatExceptionMessage(String operationId, int statusCode, String * @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 ApiResponse testHeaderIntegerBooleanStringEnumsWithHttpInfo(@java if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testHeaderIntegerBooleanStringEnums", localVarResponse); @@ -233,7 +245,8 @@ public ApiResponse testHeaderIntegerBooleanStringEnumsWithHttpInfo(@java // 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 ApiResponse testHeaderIntegerBooleanStringEnumsWithHttpInfo(@java 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 @@ static HttpRequest.Builder withAdditionalHeaders(HttpRequest.Builder builder, Ma 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 PathApi(ApiClient apiClient) { 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 @@ private String formatExceptionMessage(String operationId, int statusCode, String * @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 ApiResponse testsPathStringPathStringIntegerPathIntegerEnumNonref if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testsPathStringPathStringIntegerPathIntegerEnumNonrefStringPathEnumRefStringPath", localVarResponse); @@ -229,7 +241,8 @@ public ApiResponse testsPathStringPathStringIntegerPathIntegerEnumNonref // 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 ApiResponse testsPathStringPathStringIntegerPathIntegerEnumNonref 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 @@ static HttpRequest.Builder withAdditionalHeaders(HttpRequest.Builder builder, Ma 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 QueryApi(ApiClient apiClient) { 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 @@ private String formatExceptionMessage(String operationId, int statusCode, String * @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 ApiResponse testEnumRefStringWithHttpInfo(@javax.annotation.Nulla if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testEnumRefString", localVarResponse); @@ -227,7 +239,8 @@ public ApiResponse testEnumRefStringWithHttpInfo(@javax.annotation.Nulla // 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 ApiResponse testEnumRefStringWithHttpInfo(@javax.annotation.Nulla 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 ApiResponse testQueryDatetimeDateStringWithHttpInfo(@javax.annota if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testQueryDatetimeDateString", localVarResponse); @@ -354,7 +371,8 @@ public ApiResponse testQueryDatetimeDateStringWithHttpInfo(@javax.annota // 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 ApiResponse testQueryDatetimeDateStringWithHttpInfo(@javax.annota 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 ApiResponse testQueryIntegerBooleanStringWithHttpInfo(@javax.anno if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testQueryIntegerBooleanString", localVarResponse); @@ -483,7 +505,8 @@ public ApiResponse testQueryIntegerBooleanStringWithHttpInfo(@javax.anno // 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 ApiResponse testQueryIntegerBooleanStringWithHttpInfo(@javax.anno 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 ApiResponse testQueryStyleDeepObjectExplodeTrueObjectWithHttpInfo if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testQueryStyleDeepObjectExplodeTrueObject", localVarResponse); @@ -604,7 +631,8 @@ public ApiResponse testQueryStyleDeepObjectExplodeTrueObjectWithHttpInfo // 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 ApiResponse testQueryStyleDeepObjectExplodeTrueObjectWithHttpInfo 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 ApiResponse testQueryStyleDeepObjectExplodeTrueObjectAllOfWithHtt if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testQueryStyleDeepObjectExplodeTrueObjectAllOf", localVarResponse); @@ -726,7 +758,8 @@ public ApiResponse testQueryStyleDeepObjectExplodeTrueObjectAllOfWithHtt // 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 ApiResponse testQueryStyleDeepObjectExplodeTrueObjectAllOfWithHtt 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 ApiResponse testQueryStyleFormExplodeFalseArrayIntegerWithHttpInf if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testQueryStyleFormExplodeFalseArrayInteger", localVarResponse); @@ -848,7 +885,8 @@ public ApiResponse testQueryStyleFormExplodeFalseArrayIntegerWithHttpInf // 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 ApiResponse testQueryStyleFormExplodeFalseArrayIntegerWithHttpInf 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 ApiResponse testQueryStyleFormExplodeFalseArrayStringWithHttpInfo if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testQueryStyleFormExplodeFalseArrayString", localVarResponse); @@ -965,7 +1007,8 @@ public ApiResponse testQueryStyleFormExplodeFalseArrayStringWithHttpInfo // 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 ApiResponse testQueryStyleFormExplodeFalseArrayStringWithHttpInfo 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 ApiResponse testQueryStyleFormExplodeTrueArrayStringWithHttpInfo( if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testQueryStyleFormExplodeTrueArrayString", localVarResponse); @@ -1082,7 +1129,8 @@ public ApiResponse testQueryStyleFormExplodeTrueArrayStringWithHttpInfo( // 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 ApiResponse testQueryStyleFormExplodeTrueArrayStringWithHttpInfo( 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 ApiResponse testQueryStyleFormExplodeTrueObjectWithHttpInfo(@java if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testQueryStyleFormExplodeTrueObject", localVarResponse); @@ -1199,7 +1251,8 @@ public ApiResponse testQueryStyleFormExplodeTrueObjectWithHttpInfo(@java // 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 ApiResponse testQueryStyleFormExplodeTrueObjectWithHttpInfo(@java 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 ApiResponse testQueryStyleFormExplodeTrueObjectAllOfWithHttpInfo( if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testQueryStyleFormExplodeTrueObjectAllOf", localVarResponse); @@ -1321,7 +1378,8 @@ public ApiResponse testQueryStyleFormExplodeTrueObjectAllOfWithHttpInfo( // 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 ApiResponse testQueryStyleFormExplodeTrueObjectAllOfWithHttpInfo( 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 ApiResponse testQueryStyleJsonSerializationObjectWithHttpInfo(@ja if (memberVarResponseInterceptor != null) { memberVarResponseInterceptor.accept(localVarResponse); } + InputStream localVarResponseBody = null; try { if (localVarResponse.statusCode()/ 100 != 2) { throw getApiException("testQueryStyleJsonSerializationObject", localVarResponse); @@ -1442,7 +1504,8 @@ public ApiResponse testQueryStyleJsonSerializationObjectWithHttpInfo(@ja // 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 ApiResponse testQueryStyleJsonSerializationObjectWithHttpInfo(@ja 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 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.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 Consumer> getResponseInterceptor() { * 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 ApiClient setAsyncResponseInterceptor(Consumer> inte * * @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 ApiClient setConnectTimeout(Duration connectTimeout) { 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 @@ static HttpRequest.Builder withAdditionalHeaders(HttpRequest.Builder builder, Ma 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 AnotherFakeApi(ApiClient apiClient) { } - 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 @@ private String formatExceptionMessage(String operationId, int statusCode, String * @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 CompletableFuture call123testSpecialTags(@javax.annotation.Nonnul */ 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 CompletableFuture> call123testSpecialTagsWithHttpInfo 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 CompletableFuture> call123testSpecialTagsWithHttpInfo 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 @@ static HttpRequest.Builder withAdditionalHeaders(HttpRequest.Builder builder, Ma 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 DefaultApi(ApiClient apiClient) { } - 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 @@ private String formatExceptionMessage(String operationId, int statusCode, String * @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 CompletableFuture fooGet() throws ApiException { */ 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 CompletableFuture> fooGetWithHttpInfo( 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 CompletableFuture> fooGetWithHttpInfo( 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 @@ static HttpRequest.Builder withAdditionalHeaders(HttpRequest.Builder builder, Ma 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 FakeApi(ApiClient apiClient) { } - 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 @@ private String formatExceptionMessage(String operationId, int statusCode, String * @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 CompletableFuture fakeBigDecimalMap() throw */ 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 CompletableFuture> fakeBigDecim 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 CompletableFuture> fakeBigDecim 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 CompletableFuture fakeHealthGet() throws ApiException */ 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 CompletableFuture> fakeHealthGetWithHttpIn 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 CompletableFuture> fakeHealthGetWithHttpIn 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 CompletableFuture fakeOuterBooleanSerialize(@javax.annotation.Nu */ 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 CompletableFuture> fakeOuterBooleanSerializeWithHttp 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 CompletableFuture> fakeOuterBooleanSerializeWithHttp 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 CompletableFuture fakeOuterCompositeSerialize(@javax.anno */ 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 CompletableFuture> fakeOuterCompositeSerializ 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 CompletableFuture> fakeOuterCompositeSerializ 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 CompletableFuture fakeOuterNumberSerialize(@javax.annotation. */ 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 CompletableFuture> fakeOuterNumberSerializeWithHt 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 CompletableFuture> fakeOuterNumberSerializeWithHt 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 CompletableFuture fakeOuterStringSerialize(@javax.annotation.Null */ 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 CompletableFuture> fakeOuterStringSerializeWithHttpIn 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 CompletableFuture> fakeOuterStringSerializeWithHttpIn 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 CompletableFuture> getApplicationJsonUtf8() throws ApiExc */ 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 CompletableFuture>> getApplicationJsonUtf8Wit 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 CompletableFuture>> getApplicationJsonUtf8Wit 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 CompletableFuture> getArrayOfEnums() throws ApiException */ 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 CompletableFuture>> getArrayOfEnumsWithHttpIn 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 CompletableFuture>> getArrayOfEnumsWithHttpIn 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 CompletableFuture testAdditionalPropertiesReference(@javax.annotati */ 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 CompletableFuture> testAdditionalPropertiesReferenceWit 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 CompletableFuture testBodyWithFileSchema(@javax.annotation.Nonnull */ 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 CompletableFuture> testBodyWithFileSchemaWithHttpInfo(@ 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 CompletableFuture testBodyWithQueryParams(@javax.annotation.Nonnull */ 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 CompletableFuture> testBodyWithQueryParamsWithHttpInfo( 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 CompletableFuture testClientModel(@javax.annotation.Nonnull Clien */ 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 CompletableFuture> testClientModelWithHttpInfo(@javax 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 CompletableFuture> testClientModelWithHttpInfo(@javax 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 CompletableFuture testEndpointParameters(@javax.annotation.Nonnull */ 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 CompletableFuture> testEndpointParametersWithHttpInfo(@ 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 @@ private HttpRequest.Builder testEndpointParametersRequestBuilder(@javax.annotati } 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 CompletableFuture testEnumParameters(@javax.annotation.Nullable Lis */ 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 CompletableFuture> testEnumParametersWithHttpInfo(@java 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 @@ private HttpRequest.Builder testEnumParametersRequestBuilder(@javax.annotation.N } 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 CompletableFuture testGroupParameters(@javax.annotation.Nonnull Int */ 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 CompletableFuture> testGroupParametersWithHttpInfo(@jav 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 CompletableFuture testInlineAdditionalProperties(@javax.annotation. */ 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 CompletableFuture> testInlineAdditionalPropertiesWithHt 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 CompletableFuture testInlineFreeformAdditionalProperties(@javax.ann */ 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 CompletableFuture> testInlineFreeformAdditionalProperti 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 CompletableFuture testJsonFormData(@javax.annotation.Nonnull String */ 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 CompletableFuture> testJsonFormDataWithHttpInfo(@javax. 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 @@ private HttpRequest.Builder testJsonFormDataRequestBuilder(@javax.annotation.Non } 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 CompletableFuture testQueryParameterCollectionFormat(@javax.annotat */ 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 CompletableFuture> testQueryParameterCollectionFormatWi 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 CompletableFuture testStringMapReference(@javax.annotation.Nonnull */ 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 CompletableFuture> testStringMapReferenceWithHttpInfo(@ 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 @@ static HttpRequest.Builder withAdditionalHeaders(HttpRequest.Builder builder, Ma 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 FakeClassnameTags123Api(ApiClient apiClient) { } - 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 @@ private String formatExceptionMessage(String operationId, int statusCode, String * @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 CompletableFuture testClassname(@javax.annotation.Nonnull Client */ 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 CompletableFuture> testClassnameWithHttpInfo(@javax.a 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 CompletableFuture> testClassnameWithHttpInfo(@javax.a 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 @@ static HttpRequest.Builder withAdditionalHeaders(HttpRequest.Builder builder, Ma 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 PetApi(ApiClient apiClient) { } - 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 @@ private String formatExceptionMessage(String operationId, int statusCode, String * @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 CompletableFuture addPet(@javax.annotation.Nonnull Pet pet) throws */ 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 CompletableFuture> addPetWithHttpInfo(@javax.annotation 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 CompletableFuture deletePet(@javax.annotation.Nonnull Long petId, @ */ 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 CompletableFuture> deletePetWithHttpInfo(@javax.annotat 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 CompletableFuture> findPetsByStatus(@javax.annotation.Nonnull L */ 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 CompletableFuture>> findPetsByStatusWithHttpInfo(@j 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 CompletableFuture>> findPetsByStatusWithHttpInfo(@j 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 CompletableFuture> findPetsByTags(@javax.annotation.Nonnull Lis @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 CompletableFuture>> findPetsByTagsWithHttpInfo(@jav 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 CompletableFuture>> findPetsByTagsWithHttpInfo(@jav 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 CompletableFuture getPetById(@javax.annotation.Nonnull Long petId) t */ 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 CompletableFuture> getPetByIdWithHttpInfo(@javax.annotat 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 CompletableFuture> getPetByIdWithHttpInfo(@javax.annotat 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 CompletableFuture updatePet(@javax.annotation.Nonnull Pet pet) thro */ 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 CompletableFuture> updatePetWithHttpInfo(@javax.annotat 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 CompletableFuture updatePetWithForm(@javax.annotation.Nonnull Long */ 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 CompletableFuture> updatePetWithFormWithHttpInfo(@javax 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 @@ private HttpRequest.Builder updatePetWithFormRequestBuilder(@javax.annotation.No } 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 CompletableFuture uploadFile(@javax.annotation.Nonnull */ 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 CompletableFuture> uploadFileWithHttpInfo(@ 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 CompletableFuture> uploadFileWithHttpInfo(@ 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 @@ private HttpRequest.Builder uploadFileRequestBuilder(@javax.annotation.Nonnull L } 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 CompletableFuture uploadFileWithRequiredFile(@javax.ann */ 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 CompletableFuture> uploadFileWithRequiredFi 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 CompletableFuture> uploadFileWithRequiredFi 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 @@ private HttpRequest.Builder uploadFileWithRequiredFileRequestBuilder(@javax.anno } 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 @@ static HttpRequest.Builder withAdditionalHeaders(HttpRequest.Builder builder, Ma 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 StoreApi(ApiClient apiClient) { } - 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 @@ private String formatExceptionMessage(String operationId, int statusCode, String * @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 CompletableFuture deleteOrder(@javax.annotation.Nonnull String orde */ 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 CompletableFuture> deleteOrderWithHttpInfo(@javax.annot 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 CompletableFuture> getInventory() throws ApiExceptio */ 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 CompletableFuture>> getInventoryWithHttp 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 CompletableFuture>> getInventoryWithHttp 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 CompletableFuture getOrderById(@javax.annotation.Nonnull Long orde */ 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 CompletableFuture> getOrderByIdWithHttpInfo(@javax.ann 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 CompletableFuture> getOrderByIdWithHttpInfo(@javax.ann 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 CompletableFuture placeOrder(@javax.annotation.Nonnull Order order */ 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 CompletableFuture> placeOrderWithHttpInfo(@javax.annot 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 CompletableFuture> placeOrderWithHttpInfo(@javax.annot 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 @@ static HttpRequest.Builder withAdditionalHeaders(HttpRequest.Builder builder, Ma 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 UserApi(ApiClient apiClient) { } - 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 @@ private String formatExceptionMessage(String operationId, int statusCode, String * @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 CompletableFuture createUser(@javax.annotation.Nonnull User user) t */ 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 CompletableFuture> createUserWithHttpInfo(@javax.annota 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 CompletableFuture createUsersWithArrayInput(@javax.annotation.Nonnu */ 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 CompletableFuture> createUsersWithArrayInputWithHttpInf 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 CompletableFuture createUsersWithListInput(@javax.annotation.Nonnul */ 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 CompletableFuture> createUsersWithListInputWithHttpInfo 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 CompletableFuture deleteUser(@javax.annotation.Nonnull String usern */ 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 CompletableFuture> deleteUserWithHttpInfo(@javax.annota 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 CompletableFuture getUserByName(@javax.annotation.Nonnull String us */ 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 CompletableFuture> getUserByNameWithHttpInfo(@javax.ann 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 CompletableFuture> getUserByNameWithHttpInfo(@javax.ann 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 CompletableFuture loginUser(@javax.annotation.Nonnull String user */ 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 CompletableFuture> loginUserWithHttpInfo(@javax.annot 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 CompletableFuture> loginUserWithHttpInfo(@javax.annot 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 CompletableFuture logoutUser() throws ApiException { */ 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 CompletableFuture> logoutUserWithHttpInfo(Map { + 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 CompletableFuture updateUser(@javax.annotation.Nonnull String usern */ 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 CompletableFuture> updateUserWithHttpInfo(@javax.annota 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 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.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 Consumer> getResponseInterceptor() { * 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 ApiClient setAsyncResponseInterceptor(Consumer> inte * * @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 ApiClient setConnectTimeout(Duration connectTimeout) { 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 @@ static HttpRequest.Builder withAdditionalHeaders(HttpRequest.Builder builder, Ma 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 PetApi(ApiClient apiClient) { 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 @@ private String formatExceptionMessage(String operationId, int statusCode, String * @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 ApiResponse addPetWithHttpInfo(@jakarta.annotation.Nonnull Pet pet, 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 ApiResponse addPetWithHttpInfo(@jakarta.annotation.Nonnull Pet pet, - 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 ApiResponse addPetWithHttpInfo(@jakarta.annotation.Nonnull Pet pet, responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -332,21 +347,24 @@ public ApiResponse deletePetWithHttpInfo(@jakarta.annotation.Nonnull Long 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 ApiResponse> findPetsByStatusWithHttpInfo(@jakarta.annotation.N 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 ApiResponse> findPetsByStatusWithHttpInfo(@jakarta.annotation.N - 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 ApiResponse> findPetsByStatusWithHttpInfo(@jakarta.annotation.N responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -575,11 +597,13 @@ public ApiResponse> findPetsByTagsWithHttpInfo(@jakarta.annotation.Non 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 ApiResponse> findPetsByTagsWithHttpInfo(@jakarta.annotation.Non - 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 ApiResponse> findPetsByTagsWithHttpInfo(@jakarta.annotation.Non responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -703,11 +729,13 @@ public ApiResponse getPetByIdWithHttpInfo(@jakarta.annotation.Nonnull Long 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 ApiResponse getPetByIdWithHttpInfo(@jakarta.annotation.Nonnull Long - 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 ApiResponse getPetByIdWithHttpInfo(@jakarta.annotation.Nonnull Long responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -825,11 +855,13 @@ public ApiResponse updatePetWithHttpInfo(@jakarta.annotation.Nonnull Pet pe 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 ApiResponse updatePetWithHttpInfo(@jakarta.annotation.Nonnull Pet pe - 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 ApiResponse updatePetWithHttpInfo(@jakarta.annotation.Nonnull Pet pe responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -949,21 +983,24 @@ public ApiResponse updatePetWithFormWithHttpInfo(@jakarta.annotation.Nonnu 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 @@ private HttpRequest.Builder updatePetWithFormRequestBuilder(@jakarta.annotation. } 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 ApiResponse uploadFileWithHttpInfo(@jakarta.annotation. 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 ApiResponse uploadFileWithHttpInfo(@jakarta.annotation. - 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 ApiResponse uploadFileWithHttpInfo(@jakarta.annotation. responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -1159,8 +1201,9 @@ private HttpRequest.Builder uploadFileRequestBuilder(@jakarta.annotation.Nonnull } 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 @@ static HttpRequest.Builder withAdditionalHeaders(HttpRequest.Builder builder, Ma 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 StoreApi(ApiClient apiClient) { 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 @@ private String formatExceptionMessage(String operationId, int statusCode, String * @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 ApiResponse deleteOrderWithHttpInfo(@jakarta.annotation.Nonnull Str 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 ApiResponse> getInventoryWithHttpInfo(Map>( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -321,10 +337,9 @@ public ApiResponse> getInventoryWithHttpInfo(Map responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference>() {}); - localVarResponse.body().close(); return new ApiResponse>( localVarResponse.statusCode(), @@ -332,6 +347,9 @@ public ApiResponse> getInventoryWithHttpInfo(Map getOrderByIdWithHttpInfo(@jakarta.annotation.Nonnull L 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 ApiResponse getOrderByIdWithHttpInfo(@jakarta.annotation.Nonnull L - 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 ApiResponse getOrderByIdWithHttpInfo(@jakarta.annotation.Nonnull L responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -530,11 +552,13 @@ public ApiResponse placeOrderWithHttpInfo(@jakarta.annotation.Nonnull Ord 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 ApiResponse placeOrderWithHttpInfo(@jakarta.annotation.Nonnull Ord - 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 ApiResponse placeOrderWithHttpInfo(@jakarta.annotation.Nonnull Ord 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 @@ static HttpRequest.Builder withAdditionalHeaders(HttpRequest.Builder builder, Ma 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 UserApi(ApiClient apiClient) { 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 @@ private String formatExceptionMessage(String operationId, int statusCode, String * @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 ApiResponse createUserWithHttpInfo(@jakarta.annotation.Nonnull User 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 ApiResponse createUsersWithArrayInputWithHttpInfo(@jakarta.annotati 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 ApiResponse createUsersWithListInputWithHttpInfo(@jakarta.annotatio 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 ApiResponse deleteUserWithHttpInfo(@jakarta.annotation.Nonnull Stri 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 ApiResponse getUserByNameWithHttpInfo(@jakarta.annotation.Nonnull S 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 ApiResponse getUserByNameWithHttpInfo(@jakarta.annotation.Nonnull S - 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 ApiResponse getUserByNameWithHttpInfo(@jakarta.annotation.Nonnull S responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -748,11 +775,13 @@ public ApiResponse loginUserWithHttpInfo(@jakarta.annotation.Nonnull Str 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 ApiResponse loginUserWithHttpInfo(@jakarta.annotation.Nonnull Str - 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 ApiResponse loginUserWithHttpInfo(@jakarta.annotation.Nonnull Str responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -875,21 +906,24 @@ public ApiResponse logoutUserWithHttpInfo(Map headers) thr 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 ApiResponse updateUserWithHttpInfo(@jakarta.annotation.Nonnull Stri 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 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.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 Consumer> getResponseInterceptor() { * 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 ApiClient setAsyncResponseInterceptor(Consumer> inte * * @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 ApiClient setConnectTimeout(Duration connectTimeout) { 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 @@ static HttpRequest.Builder withAdditionalHeaders(HttpRequest.Builder builder, Ma 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 AnotherFakeApi(ApiClient apiClient) { 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 @@ private String formatExceptionMessage(String operationId, int statusCode, String * @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 ApiResponse call123testSpecialTagsWithHttpInfo(@javax.annotation. 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 ApiResponse call123testSpecialTagsWithHttpInfo(@javax.annotation. - 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 ApiResponse call123testSpecialTagsWithHttpInfo(@javax.annotation. 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 @@ static HttpRequest.Builder withAdditionalHeaders(HttpRequest.Builder builder, Ma 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 DefaultApi(ApiClient apiClient) { 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 @@ private String formatExceptionMessage(String operationId, int statusCode, String * @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 ApiResponse fooGetWithHttpInfo(Map 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 ApiResponse fooGetWithHttpInfo(Map - 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 ApiResponse fooGetWithHttpInfo(Map 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 @@ static HttpRequest.Builder withAdditionalHeaders(HttpRequest.Builder builder, Ma 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 FakeApi(ApiClient apiClient) { 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 @@ private String formatExceptionMessage(String operationId, int statusCode, String * @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 ApiResponse fakeBigDecimalMapWithHttpInfo(M 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 ApiResponse fakeBigDecimalMapWithHttpInfo(M - 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 ApiResponse fakeBigDecimalMapWithHttpInfo(M responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -322,11 +337,13 @@ public ApiResponse fakeHealthGetWithHttpInfo(Map( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -336,10 +353,9 @@ public ApiResponse fakeHealthGetWithHttpInfo(Map() {}); - localVarResponse.body().close(); return new ApiResponse( localVarResponse.statusCode(), @@ -347,6 +363,9 @@ public ApiResponse fakeHealthGetWithHttpInfo(Map fakeOuterBooleanSerializeWithHttpInfo(@javax.annotat 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 ApiResponse fakeOuterBooleanSerializeWithHttpInfo(@javax.annotat - 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 ApiResponse fakeOuterBooleanSerializeWithHttpInfo(@javax.annotat responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -546,11 +569,13 @@ public ApiResponse fakeOuterCompositeSerializeWithHttpInfo(@java 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 ApiResponse fakeOuterCompositeSerializeWithHttpInfo(@java - 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 ApiResponse fakeOuterCompositeSerializeWithHttpInfo(@java responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -661,11 +688,13 @@ public ApiResponse fakeOuterNumberSerializeWithHttpInfo(@javax.annot 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 ApiResponse fakeOuterNumberSerializeWithHttpInfo(@javax.annot - 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 ApiResponse fakeOuterNumberSerializeWithHttpInfo(@javax.annot responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -776,11 +807,13 @@ public ApiResponse fakeOuterStringSerializeWithHttpInfo(@javax.annotatio 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 ApiResponse fakeOuterStringSerializeWithHttpInfo(@javax.annotatio - 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 ApiResponse fakeOuterStringSerializeWithHttpInfo(@javax.annotatio responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -882,11 +917,13 @@ public ApiResponse> getApplicationJsonUtf8WithHttpInfo(Map>( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -896,10 +933,9 @@ public ApiResponse> getApplicationJsonUtf8WithHttpInfo(Map responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference>() {}); - localVarResponse.body().close(); return new ApiResponse>( localVarResponse.statusCode(), @@ -907,6 +943,9 @@ public ApiResponse> getApplicationJsonUtf8WithHttpInfo(Map> getArrayOfEnumsWithHttpInfo(Map>( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -1001,10 +1042,9 @@ public ApiResponse> getArrayOfEnumsWithHttpInfo(Map responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference>() {}); - localVarResponse.body().close(); return new ApiResponse>( localVarResponse.statusCode(), @@ -1012,6 +1052,9 @@ public ApiResponse> getArrayOfEnumsWithHttpInfo(Map testAdditionalPropertiesReferenceWithHttpInfo(@javax.an 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 ApiResponse testBodyWithFileSchemaWithHttpInfo(@javax.annotation.No 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 ApiResponse testBodyWithQueryParamsWithHttpInfo(@javax.annotation.N 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 ApiResponse testClientModelWithHttpInfo(@javax.annotation.Nonnull 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 ApiResponse testClientModelWithHttpInfo(@javax.annotation.Nonnull - 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 ApiResponse testClientModelWithHttpInfo(@javax.annotation.Nonnull responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -1605,21 +1661,24 @@ public ApiResponse testEndpointParametersWithHttpInfo(@javax.annotation.No 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 @@ private HttpRequest.Builder testEndpointParametersRequestBuilder(@javax.annotati } 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 ApiResponse testEnumParametersWithHttpInfo(@javax.annotation.Nullab 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 @@ private HttpRequest.Builder testEnumParametersRequestBuilder(@javax.annotation.N } 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 ApiResponse testGroupParametersWithHttpInfo(@javax.annotation.Nonnu 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 ApiResponse testInlineAdditionalPropertiesWithHttpInfo(@javax.annot 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 ApiResponse testInlineFreeformAdditionalPropertiesWithHttpInfo(@jav 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 ApiResponse testJsonFormDataWithHttpInfo(@javax.annotation.Nonnull 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 @@ private HttpRequest.Builder testJsonFormDataRequestBuilder(@javax.annotation.Non } 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 ApiResponse testQueryParameterCollectionFormatWithHttpInfo(@javax.a 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 ApiResponse testStringMapReferenceWithHttpInfo(@javax.annotation.No 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 @@ static HttpRequest.Builder withAdditionalHeaders(HttpRequest.Builder builder, Ma 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 FakeClassnameTags123Api(ApiClient apiClient) { 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 @@ private String formatExceptionMessage(String operationId, int statusCode, String * @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 ApiResponse testClassnameWithHttpInfo(@javax.annotation.Nonnull C 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 ApiResponse testClassnameWithHttpInfo(@javax.annotation.Nonnull C - 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 ApiResponse testClassnameWithHttpInfo(@javax.annotation.Nonnull C 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 @@ static HttpRequest.Builder withAdditionalHeaders(HttpRequest.Builder builder, Ma 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 PetApi(ApiClient apiClient) { 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 @@ private String formatExceptionMessage(String operationId, int statusCode, String * @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 ApiResponse addPetWithHttpInfo(@javax.annotation.Nonnull Pet pet, M 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 ApiResponse deletePetWithHttpInfo(@javax.annotation.Nonnull Long pe 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 ApiResponse> findPetsByStatusWithHttpInfo(@javax.annotation.Non 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 ApiResponse> findPetsByStatusWithHttpInfo(@javax.annotation.Non - 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 ApiResponse> findPetsByStatusWithHttpInfo(@javax.annotation.Non responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -562,11 +583,13 @@ public ApiResponse> findPetsByTagsWithHttpInfo(@javax.annotation.Nonnu 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 ApiResponse> findPetsByTagsWithHttpInfo(@javax.annotation.Nonnu - 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 ApiResponse> findPetsByTagsWithHttpInfo(@javax.annotation.Nonnu responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -690,11 +715,13 @@ public ApiResponse getPetByIdWithHttpInfo(@javax.annotation.Nonnull Long pe 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 ApiResponse getPetByIdWithHttpInfo(@javax.annotation.Nonnull Long pe - 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 ApiResponse getPetByIdWithHttpInfo(@javax.annotation.Nonnull Long pe responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -801,21 +830,24 @@ public ApiResponse updatePetWithHttpInfo(@javax.annotation.Nonnull Pet pet 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 ApiResponse updatePetWithFormWithHttpInfo(@javax.annotation.Nonnull 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 @@ private HttpRequest.Builder updatePetWithFormRequestBuilder(@javax.annotation.No } 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 ApiResponse uploadFileWithHttpInfo(@javax.annotation.No 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 ApiResponse uploadFileWithHttpInfo(@javax.annotation.No - 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 ApiResponse uploadFileWithHttpInfo(@javax.annotation.No responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -1125,8 +1165,9 @@ private HttpRequest.Builder uploadFileRequestBuilder(@javax.annotation.Nonnull L } 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 ApiResponse uploadFileWithRequiredFileWithHttpInfo(@jav 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 ApiResponse uploadFileWithRequiredFileWithHttpInfo(@jav - 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 ApiResponse uploadFileWithRequiredFileWithHttpInfo(@jav responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -1287,8 +1332,9 @@ private HttpRequest.Builder uploadFileWithRequiredFileRequestBuilder(@javax.anno } 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 @@ static HttpRequest.Builder withAdditionalHeaders(HttpRequest.Builder builder, Ma 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 StoreApi(ApiClient apiClient) { 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 @@ private String formatExceptionMessage(String operationId, int statusCode, String * @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 ApiResponse deleteOrderWithHttpInfo(@javax.annotation.Nonnull Strin 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 ApiResponse> getInventoryWithHttpInfo(Map>( localVarResponse.statusCode(), localVarResponse.headers().map(), @@ -321,10 +337,9 @@ public ApiResponse> getInventoryWithHttpInfo(Map responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference>() {}); - localVarResponse.body().close(); return new ApiResponse>( localVarResponse.statusCode(), @@ -332,6 +347,9 @@ public ApiResponse> getInventoryWithHttpInfo(Map getOrderByIdWithHttpInfo(@javax.annotation.Nonnull Lon 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 ApiResponse getOrderByIdWithHttpInfo(@javax.annotation.Nonnull Lon - 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 ApiResponse getOrderByIdWithHttpInfo(@javax.annotation.Nonnull Lon responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -530,11 +552,13 @@ public ApiResponse placeOrderWithHttpInfo(@javax.annotation.Nonnull Order 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 ApiResponse placeOrderWithHttpInfo(@javax.annotation.Nonnull Order - 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 ApiResponse placeOrderWithHttpInfo(@javax.annotation.Nonnull Order 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 @@ static HttpRequest.Builder withAdditionalHeaders(HttpRequest.Builder builder, Ma 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 UserApi(ApiClient apiClient) { 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 @@ private String formatExceptionMessage(String operationId, int statusCode, String * @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 ApiResponse createUserWithHttpInfo(@javax.annotation.Nonnull User u 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 ApiResponse createUsersWithArrayInputWithHttpInfo(@javax.annotation 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 ApiResponse createUsersWithListInputWithHttpInfo(@javax.annotation. 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 ApiResponse deleteUserWithHttpInfo(@javax.annotation.Nonnull String 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 ApiResponse getUserByNameWithHttpInfo(@javax.annotation.Nonnull Str 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 ApiResponse getUserByNameWithHttpInfo(@javax.annotation.Nonnull Str - 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 ApiResponse getUserByNameWithHttpInfo(@javax.annotation.Nonnull Str responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -748,11 +775,13 @@ public ApiResponse loginUserWithHttpInfo(@javax.annotation.Nonnull Strin 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 ApiResponse loginUserWithHttpInfo(@javax.annotation.Nonnull Strin - 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 ApiResponse loginUserWithHttpInfo(@javax.annotation.Nonnull Strin responseValue ); } finally { + if (localVarResponseBody != null) { + localVarResponseBody.close(); + } } } catch (IOException e) { throw new ApiException(e); @@ -875,21 +906,24 @@ public ApiResponse logoutUserWithHttpInfo(Map headers) thr 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 ApiResponse updateUserWithHttpInfo(@javax.annotation.Nonnull String 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);