Skip to content

Commit 6fdb632

Browse files
authored
fix: #21345 Java Native Client, handle Byte[] and File response types correctly (#21346)
1 parent c7542de commit 6fdb632

File tree

24 files changed

+1348
-39
lines changed

24 files changed

+1348
-39
lines changed

modules/openapi-generator/src/main/resources/Java/libraries/native/api.mustache

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,54 @@ public class {{classname}} {
100100
return operationId + " call failed with: " + statusCode + " - " + body;
101101
}
102102

103+
/**
104+
* Download file from the given response.
105+
*
106+
* @param response Response
107+
* @return File
108+
* @throws ApiException If fail to read file content from response and write to disk
109+
*/
110+
public File downloadFileFromResponse(HttpResponse<InputStream> response) throws ApiException {
111+
try {
112+
File file = prepareDownloadFile(response);
113+
java.nio.file.Files.copy(response.body(), file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING);
114+
return file;
115+
} catch (IOException e) {
116+
throw new ApiException(e);
117+
}
118+
}
119+
120+
/**
121+
* <p>Prepare the file for download from the response.</p>
122+
*
123+
* @param response a {@link java.net.http.HttpResponse} object.
124+
* @return a {@link java.io.File} object.
125+
* @throws java.io.IOException if any.
126+
*/
127+
private File prepareDownloadFile(HttpResponse<InputStream> response) throws IOException {
128+
String filename = null;
129+
java.util.Optional<String> contentDisposition = response.headers().firstValue("Content-Disposition");
130+
if (contentDisposition.isPresent() && !"".equals(contentDisposition.get())) {
131+
// Get filename from the Content-Disposition header.
132+
java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("filename=['\"]?([^'\"\\s]+)['\"]?");
133+
java.util.regex.Matcher matcher = pattern.matcher(contentDisposition.get());
134+
if (matcher.find())
135+
filename = matcher.group(1);
136+
}
137+
File file = null;
138+
if (filename != null) {
139+
java.nio.file.Path tempDir = java.nio.file.Files.createTempDirectory("swagger-gen-native");
140+
java.nio.file.Path filePath = java.nio.file.Files.createFile(tempDir.resolve(filename));
141+
file = filePath.toFile();
142+
tempDir.toFile().deleteOnExit(); // best effort cleanup
143+
file.deleteOnExit(); // best effort cleanup
144+
} else {
145+
file = java.nio.file.Files.createTempFile("download-", "").toFile();
146+
file.deleteOnExit(); // best effort cleanup
147+
}
148+
return file;
149+
}
150+
103151
{{#operation}}
104152
{{#vendorExtensions.x-group-parameters}}
105153
{{#hasParams}}
@@ -291,13 +339,23 @@ public class {{classname}} {
291339
);
292340
}
293341

342+
{{^isResponseFile}}{{#isResponseBinary}}
343+
Byte[] responseValue = localVarResponse.body().readAllBytes();
344+
{{/isResponseBinary}}{{/isResponseFile}}
345+
{{#isResponseFile}}
346+
// Handle file downloading.
347+
File responseValue = downloadFileFromResponse(localVarResponse);
348+
{{/isResponseFile}}
349+
{{^isResponseBinary}}{{^isResponseFile}}
294350
String responseBody = new String(localVarResponse.body().readAllBytes());
351+
{{{returnType}}} responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference<{{{returnType}}}>() {});
352+
{{/isResponseFile}}{{/isResponseBinary}}
295353
localVarResponse.body().close();
296354

297355
return new ApiResponse<{{{returnType}}}>(
298356
localVarResponse.statusCode(),
299357
localVarResponse.headers().map(),
300-
responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference<{{{returnType}}}>() {})
358+
responseValue
301359
);
302360
{{/returnType}}
303361
{{^returnType}}

samples/client/echo_api/java/native/src/main/java/org/openapitools/client/api/AuthApi.java

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,54 @@ private String formatExceptionMessage(String operationId, int statusCode, String
8181
return operationId + " call failed with: " + statusCode + " - " + body;
8282
}
8383

84+
/**
85+
* Download file from the given response.
86+
*
87+
* @param response Response
88+
* @return File
89+
* @throws ApiException If fail to read file content from response and write to disk
90+
*/
91+
public File downloadFileFromResponse(HttpResponse<InputStream> response) throws ApiException {
92+
try {
93+
File file = prepareDownloadFile(response);
94+
java.nio.file.Files.copy(response.body(), file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING);
95+
return file;
96+
} catch (IOException e) {
97+
throw new ApiException(e);
98+
}
99+
}
100+
101+
/**
102+
* <p>Prepare the file for download from the response.</p>
103+
*
104+
* @param response a {@link java.net.http.HttpResponse} object.
105+
* @return a {@link java.io.File} object.
106+
* @throws java.io.IOException if any.
107+
*/
108+
private File prepareDownloadFile(HttpResponse<InputStream> response) throws IOException {
109+
String filename = null;
110+
java.util.Optional<String> contentDisposition = response.headers().firstValue("Content-Disposition");
111+
if (contentDisposition.isPresent() && !"".equals(contentDisposition.get())) {
112+
// Get filename from the Content-Disposition header.
113+
java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("filename=['\"]?([^'\"\\s]+)['\"]?");
114+
java.util.regex.Matcher matcher = pattern.matcher(contentDisposition.get());
115+
if (matcher.find())
116+
filename = matcher.group(1);
117+
}
118+
File file = null;
119+
if (filename != null) {
120+
java.nio.file.Path tempDir = java.nio.file.Files.createTempDirectory("swagger-gen-native");
121+
java.nio.file.Path filePath = java.nio.file.Files.createFile(tempDir.resolve(filename));
122+
file = filePath.toFile();
123+
tempDir.toFile().deleteOnExit(); // best effort cleanup
124+
file.deleteOnExit(); // best effort cleanup
125+
} else {
126+
file = java.nio.file.Files.createTempFile("download-", "").toFile();
127+
file.deleteOnExit(); // best effort cleanup
128+
}
129+
return file;
130+
}
131+
84132
/**
85133
* To test HTTP basic authentication
86134
* To test HTTP basic authentication

samples/client/echo_api/java/native/src/main/java/org/openapitools/client/api/BodyApi.java

Lines changed: 68 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,54 @@ private String formatExceptionMessage(String operationId, int statusCode, String
9191
return operationId + " call failed with: " + statusCode + " - " + body;
9292
}
9393

94+
/**
95+
* Download file from the given response.
96+
*
97+
* @param response Response
98+
* @return File
99+
* @throws ApiException If fail to read file content from response and write to disk
100+
*/
101+
public File downloadFileFromResponse(HttpResponse<InputStream> response) throws ApiException {
102+
try {
103+
File file = prepareDownloadFile(response);
104+
java.nio.file.Files.copy(response.body(), file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING);
105+
return file;
106+
} catch (IOException e) {
107+
throw new ApiException(e);
108+
}
109+
}
110+
111+
/**
112+
* <p>Prepare the file for download from the response.</p>
113+
*
114+
* @param response a {@link java.net.http.HttpResponse} object.
115+
* @return a {@link java.io.File} object.
116+
* @throws java.io.IOException if any.
117+
*/
118+
private File prepareDownloadFile(HttpResponse<InputStream> response) throws IOException {
119+
String filename = null;
120+
java.util.Optional<String> contentDisposition = response.headers().firstValue("Content-Disposition");
121+
if (contentDisposition.isPresent() && !"".equals(contentDisposition.get())) {
122+
// Get filename from the Content-Disposition header.
123+
java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("filename=['\"]?([^'\"\\s]+)['\"]?");
124+
java.util.regex.Matcher matcher = pattern.matcher(contentDisposition.get());
125+
if (matcher.find())
126+
filename = matcher.group(1);
127+
}
128+
File file = null;
129+
if (filename != null) {
130+
java.nio.file.Path tempDir = java.nio.file.Files.createTempDirectory("swagger-gen-native");
131+
java.nio.file.Path filePath = java.nio.file.Files.createFile(tempDir.resolve(filename));
132+
file = filePath.toFile();
133+
tempDir.toFile().deleteOnExit(); // best effort cleanup
134+
file.deleteOnExit(); // best effort cleanup
135+
} else {
136+
file = java.nio.file.Files.createTempFile("download-", "").toFile();
137+
file.deleteOnExit(); // best effort cleanup
138+
}
139+
return file;
140+
}
141+
94142
/**
95143
* Test binary (gif) response body
96144
* Test binary (gif) response body
@@ -129,13 +177,16 @@ public ApiResponse<File> testBinaryGifWithHttpInfo() throws ApiException {
129177
);
130178
}
131179

132-
String responseBody = new String(localVarResponse.body().readAllBytes());
180+
181+
// Handle file downloading.
182+
File responseValue = downloadFileFromResponse(localVarResponse);
183+
133184
localVarResponse.body().close();
134185

135186
return new ApiResponse<File>(
136187
localVarResponse.statusCode(),
137188
localVarResponse.headers().map(),
138-
responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference<File>() {})
189+
responseValue
139190
);
140191
} finally {
141192
}
@@ -514,13 +565,17 @@ public ApiResponse<Pet> testEchoBodyAllOfPetWithHttpInfo(@javax.annotation.Nulla
514565
);
515566
}
516567

568+
569+
517570
String responseBody = new String(localVarResponse.body().readAllBytes());
571+
Pet responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference<Pet>() {});
572+
518573
localVarResponse.body().close();
519574

520575
return new ApiResponse<Pet>(
521576
localVarResponse.statusCode(),
522577
localVarResponse.headers().map(),
523-
responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference<Pet>() {})
578+
responseValue
524579
);
525580
} finally {
526581
}
@@ -681,13 +736,17 @@ public ApiResponse<Pet> testEchoBodyPetWithHttpInfo(@javax.annotation.Nullable P
681736
);
682737
}
683738

739+
740+
684741
String responseBody = new String(localVarResponse.body().readAllBytes());
742+
Pet responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference<Pet>() {});
743+
685744
localVarResponse.body().close();
686745

687746
return new ApiResponse<Pet>(
688747
localVarResponse.statusCode(),
689748
localVarResponse.headers().map(),
690-
responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference<Pet>() {})
749+
responseValue
691750
);
692751
} finally {
693752
}
@@ -848,13 +907,17 @@ public ApiResponse<StringEnumRef> testEchoBodyStringEnumWithHttpInfo(@javax.anno
848907
);
849908
}
850909

910+
911+
851912
String responseBody = new String(localVarResponse.body().readAllBytes());
913+
StringEnumRef responseValue = responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference<StringEnumRef>() {});
914+
852915
localVarResponse.body().close();
853916

854917
return new ApiResponse<StringEnumRef>(
855918
localVarResponse.statusCode(),
856919
localVarResponse.headers().map(),
857-
responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference<StringEnumRef>() {})
920+
responseValue
858921
);
859922
} finally {
860923
}

samples/client/echo_api/java/native/src/main/java/org/openapitools/client/api/FormApi.java

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,54 @@ private String formatExceptionMessage(String operationId, int statusCode, String
8888
return operationId + " call failed with: " + statusCode + " - " + body;
8989
}
9090

91+
/**
92+
* Download file from the given response.
93+
*
94+
* @param response Response
95+
* @return File
96+
* @throws ApiException If fail to read file content from response and write to disk
97+
*/
98+
public File downloadFileFromResponse(HttpResponse<InputStream> response) throws ApiException {
99+
try {
100+
File file = prepareDownloadFile(response);
101+
java.nio.file.Files.copy(response.body(), file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING);
102+
return file;
103+
} catch (IOException e) {
104+
throw new ApiException(e);
105+
}
106+
}
107+
108+
/**
109+
* <p>Prepare the file for download from the response.</p>
110+
*
111+
* @param response a {@link java.net.http.HttpResponse} object.
112+
* @return a {@link java.io.File} object.
113+
* @throws java.io.IOException if any.
114+
*/
115+
private File prepareDownloadFile(HttpResponse<InputStream> response) throws IOException {
116+
String filename = null;
117+
java.util.Optional<String> contentDisposition = response.headers().firstValue("Content-Disposition");
118+
if (contentDisposition.isPresent() && !"".equals(contentDisposition.get())) {
119+
// Get filename from the Content-Disposition header.
120+
java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("filename=['\"]?([^'\"\\s]+)['\"]?");
121+
java.util.regex.Matcher matcher = pattern.matcher(contentDisposition.get());
122+
if (matcher.find())
123+
filename = matcher.group(1);
124+
}
125+
File file = null;
126+
if (filename != null) {
127+
java.nio.file.Path tempDir = java.nio.file.Files.createTempDirectory("swagger-gen-native");
128+
java.nio.file.Path filePath = java.nio.file.Files.createFile(tempDir.resolve(filename));
129+
file = filePath.toFile();
130+
tempDir.toFile().deleteOnExit(); // best effort cleanup
131+
file.deleteOnExit(); // best effort cleanup
132+
} else {
133+
file = java.nio.file.Files.createTempFile("download-", "").toFile();
134+
file.deleteOnExit(); // best effort cleanup
135+
}
136+
return file;
137+
}
138+
91139
/**
92140
* Test form parameter(s)
93141
* Test form parameter(s)

samples/client/echo_api/java/native/src/main/java/org/openapitools/client/api/HeaderApi.java

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,54 @@ private String formatExceptionMessage(String operationId, int statusCode, String
8888
return operationId + " call failed with: " + statusCode + " - " + body;
8989
}
9090

91+
/**
92+
* Download file from the given response.
93+
*
94+
* @param response Response
95+
* @return File
96+
* @throws ApiException If fail to read file content from response and write to disk
97+
*/
98+
public File downloadFileFromResponse(HttpResponse<InputStream> response) throws ApiException {
99+
try {
100+
File file = prepareDownloadFile(response);
101+
java.nio.file.Files.copy(response.body(), file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING);
102+
return file;
103+
} catch (IOException e) {
104+
throw new ApiException(e);
105+
}
106+
}
107+
108+
/**
109+
* <p>Prepare the file for download from the response.</p>
110+
*
111+
* @param response a {@link java.net.http.HttpResponse} object.
112+
* @return a {@link java.io.File} object.
113+
* @throws java.io.IOException if any.
114+
*/
115+
private File prepareDownloadFile(HttpResponse<InputStream> response) throws IOException {
116+
String filename = null;
117+
java.util.Optional<String> contentDisposition = response.headers().firstValue("Content-Disposition");
118+
if (contentDisposition.isPresent() && !"".equals(contentDisposition.get())) {
119+
// Get filename from the Content-Disposition header.
120+
java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("filename=['\"]?([^'\"\\s]+)['\"]?");
121+
java.util.regex.Matcher matcher = pattern.matcher(contentDisposition.get());
122+
if (matcher.find())
123+
filename = matcher.group(1);
124+
}
125+
File file = null;
126+
if (filename != null) {
127+
java.nio.file.Path tempDir = java.nio.file.Files.createTempDirectory("swagger-gen-native");
128+
java.nio.file.Path filePath = java.nio.file.Files.createFile(tempDir.resolve(filename));
129+
file = filePath.toFile();
130+
tempDir.toFile().deleteOnExit(); // best effort cleanup
131+
file.deleteOnExit(); // best effort cleanup
132+
} else {
133+
file = java.nio.file.Files.createTempFile("download-", "").toFile();
134+
file.deleteOnExit(); // best effort cleanup
135+
}
136+
return file;
137+
}
138+
91139
/**
92140
* Test header parameter(s)
93141
* Test header parameter(s)

0 commit comments

Comments
 (0)