Skip to content

Commit 8ab3bb4

Browse files
Remove thread unsafe statusCode and responseHeaders instance variables from apache http ApiClient (#19054)
* remove thread unsafe statusCode and responseHeaders instance variables * re-add status code and header getters for backwards compatibility * add import * whitespace cleanup * use deprecated thread id getter for backwards compatibility with pre-19 java
1 parent a3912b7 commit 8ab3bb4

File tree

3 files changed

+39
-18
lines changed
  • modules/openapi-generator/src/main/resources/Java/libraries/apache-httpclient
  • samples/client
    • echo_api/java/apache-httpclient/src/main/java/org/openapitools/client
    • petstore/java/apache-httpclient/src/main/java/org/openapitools/client

3 files changed

+39
-18
lines changed

modules/openapi-generator/src/main/resources/Java/libraries/apache-httpclient/ApiClient.mustache

+13-6
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ import java.util.ArrayList;
5050
import java.util.Date;
5151
import java.util.function.Supplier;
5252
import java.util.TimeZone;
53+
import java.util.concurrent.ConcurrentHashMap;
5354
import java.util.regex.Matcher;
5455
import java.util.regex.Pattern;
5556

@@ -125,8 +126,8 @@ public class ApiClient{{#jsr310}} extends JavaTimeFormatter{{/jsr310}} {
125126

126127
private Map<String, Authentication> authentications;
127128

128-
private int statusCode;
129-
private Map<String, List<String>> responseHeaders;
129+
private Map<Long, Integer> lastStatusCodeByThread = new ConcurrentHashMap<>();
130+
private Map<Long, Map<String, List<String>>> lastResponseHeadersByThread = new ConcurrentHashMap<>();
130131

131132
private DateFormat dateFormat;
132133

@@ -279,16 +280,18 @@ public class ApiClient{{#jsr310}} extends JavaTimeFormatter{{/jsr310}} {
279280
*
280281
* @return Status code
281282
*/
283+
@Deprecated
282284
public int getStatusCode() {
283-
return statusCode;
285+
return lastStatusCodeByThread.get(Thread.currentThread().getId());
284286
}
285287

286288
/**
287289
* Gets the response headers of the previous request
288290
* @return Response headers
289291
*/
292+
@Deprecated
290293
public Map<String, List<String>> getResponseHeaders() {
291-
return responseHeaders;
294+
return lastResponseHeadersByThread.get(Thread.currentThread().getId());
292295
}
293296

294297
/**
@@ -863,6 +866,7 @@ public class ApiClient{{#jsr310}} extends JavaTimeFormatter{{/jsr310}} {
863866
// convert input stream to string
864867
return (T) EntityUtils.toString(entity);
865868
} else {
869+
Map<String, List<String>> responseHeaders = transformResponseHeaders(response.getHeaders());
866870
throw new ApiException(
867871
"Deserialization for content type '" + mimeType + "' not supported for type '" + valueType + "'",
868872
response.getCode(),
@@ -1008,12 +1012,15 @@ public class ApiClient{{#jsr310}} extends JavaTimeFormatter{{/jsr310}} {
10081012
}
10091013

10101014
protected <T> T processResponse(CloseableHttpResponse response, TypeReference<T> returnType) throws ApiException, IOException, ParseException {
1011-
statusCode = response.getCode();
1015+
int statusCode = response.getCode();
1016+
lastStatusCodeByThread.put(Thread.currentThread().getId(), statusCode);
10121017
if (statusCode == HttpStatus.SC_NO_CONTENT) {
10131018
return null;
10141019
}
10151020

1016-
responseHeaders = transformResponseHeaders(response.getHeaders());
1021+
Map<String, List<String>> responseHeaders = transformResponseHeaders(response.getHeaders());
1022+
lastResponseHeadersByThread.put(Thread.currentThread().getId(), responseHeaders);
1023+
10171024
if (isSuccessfulStatus(statusCode)) {
10181025
return this.deserialize(response, returnType);
10191026
} else {

samples/client/echo_api/java/apache-httpclient/src/main/java/org/openapitools/client/ApiClient.java

+13-6
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
import java.util.Date;
5757
import java.util.function.Supplier;
5858
import java.util.TimeZone;
59+
import java.util.concurrent.ConcurrentHashMap;
5960
import java.util.regex.Matcher;
6061
import java.util.regex.Pattern;
6162

@@ -103,8 +104,8 @@ public class ApiClient extends JavaTimeFormatter {
103104

104105
private Map<String, Authentication> authentications;
105106

106-
private int statusCode;
107-
private Map<String, List<String>> responseHeaders;
107+
private Map<Long, Integer> lastStatusCodeByThread = new ConcurrentHashMap<>();
108+
private Map<Long, Map<String, List<String>>> lastResponseHeadersByThread = new ConcurrentHashMap<>();
108109

109110
private DateFormat dateFormat;
110111

@@ -250,16 +251,18 @@ public ApiClient setServerVariables(Map<String, String> serverVariables) {
250251
*
251252
* @return Status code
252253
*/
254+
@Deprecated
253255
public int getStatusCode() {
254-
return statusCode;
256+
return lastStatusCodeByThread.get(Thread.currentThread().getId());
255257
}
256258

257259
/**
258260
* Gets the response headers of the previous request
259261
* @return Response headers
260262
*/
263+
@Deprecated
261264
public Map<String, List<String>> getResponseHeaders() {
262-
return responseHeaders;
265+
return lastResponseHeadersByThread.get(Thread.currentThread().getId());
263266
}
264267

265268
/**
@@ -781,6 +784,7 @@ public <T> T deserialize(CloseableHttpResponse response, TypeReference<T> valueT
781784
// convert input stream to string
782785
return (T) EntityUtils.toString(entity);
783786
} else {
787+
Map<String, List<String>> responseHeaders = transformResponseHeaders(response.getHeaders());
784788
throw new ApiException(
785789
"Deserialization for content type '" + mimeType + "' not supported for type '" + valueType + "'",
786790
response.getCode(),
@@ -926,12 +930,15 @@ protected Cookie buildCookie(String key, String value, URI uri) {
926930
}
927931

928932
protected <T> T processResponse(CloseableHttpResponse response, TypeReference<T> returnType) throws ApiException, IOException, ParseException {
929-
statusCode = response.getCode();
933+
int statusCode = response.getCode();
934+
lastStatusCodeByThread.put(Thread.currentThread().getId(), statusCode);
930935
if (statusCode == HttpStatus.SC_NO_CONTENT) {
931936
return null;
932937
}
933938

934-
responseHeaders = transformResponseHeaders(response.getHeaders());
939+
Map<String, List<String>> responseHeaders = transformResponseHeaders(response.getHeaders());
940+
lastResponseHeadersByThread.put(Thread.currentThread().getId(), responseHeaders);
941+
935942
if (isSuccessfulStatus(statusCode)) {
936943
return this.deserialize(response, returnType);
937944
} else {

samples/client/petstore/java/apache-httpclient/src/main/java/org/openapitools/client/ApiClient.java

+13-6
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
import java.util.Date;
5757
import java.util.function.Supplier;
5858
import java.util.TimeZone;
59+
import java.util.concurrent.ConcurrentHashMap;
5960
import java.util.regex.Matcher;
6061
import java.util.regex.Pattern;
6162

@@ -148,8 +149,8 @@ public class ApiClient extends JavaTimeFormatter {
148149

149150
private Map<String, Authentication> authentications;
150151

151-
private int statusCode;
152-
private Map<String, List<String>> responseHeaders;
152+
private Map<Long, Integer> lastStatusCodeByThread = new ConcurrentHashMap<>();
153+
private Map<Long, Map<String, List<String>>> lastResponseHeadersByThread = new ConcurrentHashMap<>();
153154

154155
private DateFormat dateFormat;
155156

@@ -298,16 +299,18 @@ public ApiClient setServerVariables(Map<String, String> serverVariables) {
298299
*
299300
* @return Status code
300301
*/
302+
@Deprecated
301303
public int getStatusCode() {
302-
return statusCode;
304+
return lastStatusCodeByThread.get(Thread.currentThread().getId());
303305
}
304306

305307
/**
306308
* Gets the response headers of the previous request
307309
* @return Response headers
308310
*/
311+
@Deprecated
309312
public Map<String, List<String>> getResponseHeaders() {
310-
return responseHeaders;
313+
return lastResponseHeadersByThread.get(Thread.currentThread().getId());
311314
}
312315

313316
/**
@@ -874,6 +877,7 @@ public <T> T deserialize(CloseableHttpResponse response, TypeReference<T> valueT
874877
// convert input stream to string
875878
return (T) EntityUtils.toString(entity);
876879
} else {
880+
Map<String, List<String>> responseHeaders = transformResponseHeaders(response.getHeaders());
877881
throw new ApiException(
878882
"Deserialization for content type '" + mimeType + "' not supported for type '" + valueType + "'",
879883
response.getCode(),
@@ -1019,12 +1023,15 @@ protected Cookie buildCookie(String key, String value, URI uri) {
10191023
}
10201024

10211025
protected <T> T processResponse(CloseableHttpResponse response, TypeReference<T> returnType) throws ApiException, IOException, ParseException {
1022-
statusCode = response.getCode();
1026+
int statusCode = response.getCode();
1027+
lastStatusCodeByThread.put(Thread.currentThread().getId(), statusCode);
10231028
if (statusCode == HttpStatus.SC_NO_CONTENT) {
10241029
return null;
10251030
}
10261031

1027-
responseHeaders = transformResponseHeaders(response.getHeaders());
1032+
Map<String, List<String>> responseHeaders = transformResponseHeaders(response.getHeaders());
1033+
lastResponseHeadersByThread.put(Thread.currentThread().getId(), responseHeaders);
1034+
10281035
if (isSuccessfulStatus(statusCode)) {
10291036
return this.deserialize(response, returnType);
10301037
} else {

0 commit comments

Comments
 (0)