Skip to content

Commit 6ba652f

Browse files
author
childish-sambino
authored
[DI-1920] fix: set socket config with blocking operation timeout (#670)
1 parent 6de0d4f commit 6ba652f

File tree

3 files changed

+93
-60
lines changed

3 files changed

+93
-60
lines changed

src/main/java/com/twilio/http/HttpClient.java

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,44 @@
11
package com.twilio.http;
22

3+
import lombok.Getter;
4+
import lombok.Setter;
35
import org.apache.http.client.RedirectStrategy;
6+
import org.apache.http.client.config.RequestConfig;
7+
import org.apache.http.config.SocketConfig;
48
import org.apache.http.impl.client.DefaultRedirectStrategy;
59

610
public abstract class HttpClient {
711

12+
public static final int CONNECTION_TIMEOUT = 10000;
13+
public static final int SOCKET_TIMEOUT = 30500;
14+
public static final RequestConfig DEFAULT_REQUEST_CONFIG = RequestConfig
15+
.custom()
16+
.setConnectTimeout(CONNECTION_TIMEOUT)
17+
.setSocketTimeout(SOCKET_TIMEOUT)
18+
.build();
19+
public static final SocketConfig DEFAULT_SOCKET_CONFIG = SocketConfig
20+
.custom()
21+
.setSoTimeout(SOCKET_TIMEOUT)
22+
.build();
23+
824
public static final int ANY_500 = -500;
925
public static final int ANY_400 = -400;
1026
public static final int ANY_300 = -300;
1127
public static final int ANY_200 = -200;
1228
public static final int ANY_100 = -100;
1329

14-
public static final int[] RETRY_CODES = new int[]{ANY_500};
30+
public static final int[] RETRY_CODES = new int[] {ANY_500};
1531
public static final int RETRIES = 3;
1632
public static final long DELAY_MILLIS = 100L;
1733

1834
// Default redirect strategy to not auto-redirect for any methods (empty string array).
35+
@Getter
36+
@Setter
1937
private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy(new String[0]);
2038

39+
@Getter
2140
private Response lastResponse;
41+
@Getter
2242
private Request lastRequest;
2343

2444
/**
@@ -66,14 +86,6 @@ public Response reliableRequest(final Request request, final int[] retryCodes, i
6686
return response;
6787
}
6888

69-
public Response getLastResponse() {
70-
return lastResponse;
71-
}
72-
73-
public Request getLastRequest() {
74-
return lastRequest;
75-
}
76-
7789
protected boolean shouldRetry(final Response response, final int[] retryCodes) {
7890
if (response == null) {
7991
return true;
@@ -119,13 +131,5 @@ protected boolean shouldRetry(final Response response, final int[] retryCodes) {
119131
return false;
120132
}
121133

122-
public RedirectStrategy getRedirectStrategy() {
123-
return redirectStrategy;
124-
}
125-
126-
public void setRedirectStrategy(final RedirectStrategy redirectStrategy) {
127-
this.redirectStrategy = redirectStrategy;
128-
}
129-
130134
public abstract Response makeRequest(final Request request);
131135
}

src/main/java/com/twilio/http/NetworkHttpClient.java

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,48 +2,54 @@
22

33
import com.twilio.Twilio;
44
import com.twilio.exception.ApiException;
5+
6+
import java.io.IOException;
7+
import java.nio.charset.StandardCharsets;
8+
import java.util.Arrays;
9+
import java.util.Collection;
10+
import java.util.List;
11+
import java.util.Map;
12+
513
import org.apache.http.HttpEntity;
614
import org.apache.http.HttpHeaders;
715
import org.apache.http.HttpResponse;
816
import org.apache.http.HttpVersion;
9-
import org.apache.http.client.utils.HttpClientUtils;
10-
import org.apache.http.entity.BufferedHttpEntity;
1117
import org.apache.http.client.config.RequestConfig;
1218
import org.apache.http.client.methods.RequestBuilder;
19+
import org.apache.http.client.utils.HttpClientUtils;
20+
import org.apache.http.config.SocketConfig;
21+
import org.apache.http.entity.BufferedHttpEntity;
1322
import org.apache.http.impl.client.HttpClientBuilder;
1423
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
1524
import org.apache.http.message.BasicHeader;
1625

17-
import java.io.IOException;
18-
import java.nio.charset.StandardCharsets;
19-
import java.util.Arrays;
20-
import java.util.Collection;
21-
import java.util.List;
22-
import java.util.Map;
23-
2426
public class NetworkHttpClient extends HttpClient {
2527

26-
private static final int CONNECTION_TIMEOUT = 10000;
27-
private static final int SOCKET_TIMEOUT = 30500;
28-
2928
private final org.apache.http.client.HttpClient client;
3029

3130
/**
3231
* Create a new HTTP Client.
3332
*/
3433
public NetworkHttpClient() {
35-
this(RequestConfig.custom()
36-
.setConnectTimeout(CONNECTION_TIMEOUT)
37-
.setSocketTimeout(SOCKET_TIMEOUT)
38-
.build()
39-
);
34+
this(DEFAULT_REQUEST_CONFIG);
4035
}
4136

4237
/**
4338
* Create a new HTTP Client with a custom request config.
44-
* @param config a RequestConfig.
39+
*
40+
* @param requestConfig a RequestConfig.
4541
*/
46-
public NetworkHttpClient(RequestConfig config) {
42+
public NetworkHttpClient(final RequestConfig requestConfig) {
43+
this(requestConfig, DEFAULT_SOCKET_CONFIG);
44+
}
45+
46+
/**
47+
* Create a new HTTP Client with a custom request and socket config.
48+
*
49+
* @param requestConfig a RequestConfig.
50+
* @param socketConfig a SocketConfig.
51+
*/
52+
public NetworkHttpClient(final RequestConfig requestConfig, final SocketConfig socketConfig) {
4753
Collection<BasicHeader> headers = Arrays.asList(
4854
new BasicHeader("X-Twilio-Client", "java-" + Twilio.VERSION),
4955
new BasicHeader(HttpHeaders.USER_AGENT, "twilio-java/" + Twilio.VERSION + " (" + Twilio.JAVA_VERSION + ")"),
@@ -61,12 +67,13 @@ public NetworkHttpClient(RequestConfig config) {
6167
}
6268

6369
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
64-
connectionManager.setDefaultMaxPerRoute(10);
65-
connectionManager.setMaxTotal(10*2);
70+
connectionManager.setDefaultSocketConfig(socketConfig);
71+
connectionManager.setDefaultMaxPerRoute(10);
72+
connectionManager.setMaxTotal(10 * 2);
6673

6774
client = clientBuilder
6875
.setConnectionManager(connectionManager)
69-
.setDefaultRequestConfig(config)
76+
.setDefaultRequestConfig(requestConfig)
7077
.setDefaultHeaders(headers)
7178
.setRedirectStrategy(this.getRedirectStrategy())
7279
.build();
@@ -145,6 +152,5 @@ public Response makeRequest(final Request request) {
145152
HttpClientUtils.closeQuietly(response);
146153

147154
}
148-
149155
}
150156
}

src/main/java/com/twilio/http/ValidationClient.java

Lines changed: 43 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.apache.http.HttpVersion;
88
import org.apache.http.client.config.RequestConfig;
99
import org.apache.http.client.methods.RequestBuilder;
10+
import org.apache.http.config.SocketConfig;
1011
import org.apache.http.impl.client.HttpClientBuilder;
1112
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
1213
import org.apache.http.message.BasicHeader;
@@ -21,47 +22,69 @@
2122

2223
public class ValidationClient extends HttpClient {
2324

24-
private static final int CONNECTION_TIMEOUT = 10000;
25-
private static final int SOCKET_TIMEOUT = 30500;
26-
private static final RequestConfig DEFAULT_REQUEST_CONFIG = RequestConfig.custom()
27-
.setConnectTimeout(CONNECTION_TIMEOUT)
28-
.setSocketTimeout(SOCKET_TIMEOUT)
29-
.build();;
30-
3125
private final org.apache.http.client.HttpClient client;
3226

3327
/**
3428
* Create a new ValidationClient.
3529
*
36-
* @param accountSid Twilio Account SID
37-
* @param credentialSid Twilio Credential SID
38-
* @param signingKey Twilio Signing key
39-
* @param privateKey Private Key
30+
* @param accountSid Twilio Account SID
31+
* @param credentialSid Twilio Credential SID
32+
* @param signingKey Twilio Signing key
33+
* @param privateKey Private Key
4034
*/
41-
public ValidationClient(String accountSid, String credentialSid, String signingKey, PrivateKey privateKey) {
35+
public ValidationClient(final String accountSid,
36+
final String credentialSid,
37+
final String signingKey,
38+
final PrivateKey privateKey) {
4239
this(accountSid, credentialSid, signingKey, privateKey, DEFAULT_REQUEST_CONFIG);
4340
}
4441

4542
/**
4643
* Create a new ValidationClient.
4744
*
48-
* @param accountSid Twilio Account SID
49-
* @param credentialSid Twilio Credential SID
50-
* @param signingKey Twilio Signing key
51-
* @param privateKey Private Key
52-
* @param config HTTP Request Config
45+
* @param accountSid Twilio Account SID
46+
* @param credentialSid Twilio Credential SID
47+
* @param signingKey Twilio Signing key
48+
* @param privateKey Private Key
49+
* @param requestConfig HTTP Request Config
50+
*/
51+
public ValidationClient(final String accountSid,
52+
final String credentialSid,
53+
final String signingKey,
54+
final PrivateKey privateKey,
55+
final RequestConfig requestConfig) {
56+
this(accountSid, credentialSid, signingKey, privateKey, requestConfig, DEFAULT_SOCKET_CONFIG);
57+
}
58+
59+
/**
60+
* Create a new ValidationClient.
61+
*
62+
* @param accountSid Twilio Account SID
63+
* @param credentialSid Twilio Credential SID
64+
* @param signingKey Twilio Signing key
65+
* @param privateKey Private Key
66+
* @param requestConfig HTTP Request Config
67+
* @param socketConfig HTTP Socket Config
5368
*/
54-
public ValidationClient(String accountSid, String credentialSid, String signingKey, PrivateKey privateKey, RequestConfig config) {
69+
public ValidationClient(final String accountSid,
70+
final String credentialSid,
71+
final String signingKey,
72+
final PrivateKey privateKey,
73+
final RequestConfig requestConfig,
74+
final SocketConfig socketConfig) {
5575
Collection<BasicHeader> headers = Arrays.asList(
5676
new BasicHeader("X-Twilio-Client", "java-" + Twilio.VERSION),
5777
new BasicHeader(HttpHeaders.USER_AGENT, "twilio-java/" + Twilio.VERSION + " (" + Twilio.JAVA_VERSION + ")"),
5878
new BasicHeader(HttpHeaders.ACCEPT, "application/json"),
5979
new BasicHeader(HttpHeaders.ACCEPT_ENCODING, "utf-8")
6080
);
6181

82+
final PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
83+
connectionManager.setDefaultSocketConfig(socketConfig);
84+
6285
client = HttpClientBuilder.create()
63-
.setConnectionManager(new PoolingHttpClientConnectionManager())
64-
.setDefaultRequestConfig(config)
86+
.setConnectionManager(connectionManager)
87+
.setDefaultRequestConfig(requestConfig)
6588
.setDefaultHeaders(headers)
6689
.setMaxConnPerRoute(10)
6790
.addInterceptorLast(new ValidationInterceptor(accountSid, credentialSid, signingKey, privateKey))

0 commit comments

Comments
 (0)