Skip to content

Commit d47fbe1

Browse files
authored
fix: added new httpclient for noauth and bearertoken requests (#808)
* added new httpclient for noauth and bearertoken requests
1 parent ab74cef commit d47fbe1

File tree

10 files changed

+533
-153
lines changed

10 files changed

+533
-153
lines changed

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,15 @@ public abstract class HttpClient {
3939
@Getter
4040
private Response lastResponse;
4141
@Getter
42-
private IRequest lastRequest;
42+
private Request lastRequest;
4343

4444
/**
4545
* Make a request.
4646
*
4747
* @param request request to make
4848
* @return Response of the HTTP request
4949
*/
50-
public Response reliableRequest(final IRequest request) {
50+
public Response reliableRequest(final Request request) {
5151
return reliableRequest(request, RETRY_CODES, RETRIES, DELAY_MILLIS);
5252
}
5353

@@ -60,7 +60,7 @@ public Response reliableRequest(final IRequest request) {
6060
* @param delayMillis delays between retries
6161
* @return Response of the HTTP request
6262
*/
63-
public Response reliableRequest(final IRequest request, final int[] retryCodes, int retries,
63+
public Response reliableRequest(final Request request, final int[] retryCodes, int retries,
6464
final long delayMillis) {
6565
lastRequest = request;
6666
Response response = null;
@@ -131,6 +131,5 @@ protected boolean shouldRetry(final Response response, final int[] retryCodes) {
131131
return false;
132132
}
133133

134-
public abstract <T extends IRequest> Response makeRequest(final T request);
135-
134+
public abstract Response makeRequest(final Request request);
136135
}

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

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,14 @@
33
import com.twilio.Twilio;
44
import com.twilio.constant.EnumConstants;
55
import com.twilio.exception.ApiException;
6-
import com.twilio.http.bearertoken.BearerTokenRequest;
6+
7+
import java.io.IOException;
8+
import java.nio.charset.StandardCharsets;
9+
import java.util.Arrays;
10+
import java.util.Collection;
11+
import java.util.List;
12+
import java.util.Map;
13+
714
import org.apache.http.HttpEntity;
815
import org.apache.http.HttpHeaders;
916
import org.apache.http.HttpResponse;
@@ -19,13 +26,6 @@
1926
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
2027
import org.apache.http.message.BasicHeader;
2128

22-
import java.io.IOException;
23-
import java.nio.charset.StandardCharsets;
24-
import java.util.Arrays;
25-
import java.util.Collection;
26-
import java.util.List;
27-
import java.util.Map;
28-
2929
public class NetworkHttpClient extends HttpClient {
3030

3131
protected final org.apache.http.client.HttpClient client;
@@ -57,8 +57,7 @@ public NetworkHttpClient(final RequestConfig requestConfig) {
5757
public NetworkHttpClient(final RequestConfig requestConfig, final SocketConfig socketConfig) {
5858
Collection<BasicHeader> headers = Arrays.asList(
5959
new BasicHeader("X-Twilio-Client", "java-" + Twilio.VERSION),
60-
// new BasicHeader(HttpHeaders.ACCEPT, "application/json"),
61-
//new BasicHeader(HttpHeaders.ACCEPT, "application/scim+json"),
60+
new BasicHeader(HttpHeaders.ACCEPT, "application/json"),
6261
new BasicHeader(HttpHeaders.ACCEPT_ENCODING, "utf-8")
6362
);
6463

@@ -114,24 +113,16 @@ public NetworkHttpClient(HttpClientBuilder clientBuilder) {
114113
* @param request request to make
115114
* @return Response of the HTTP request
116115
*/
117-
public <T extends IRequest> Response makeRequest(final T request) {
116+
public Response makeRequest(final Request request) {
118117

119118
HttpMethod method = request.getMethod();
120119
RequestBuilder builder = RequestBuilder.create(method.toString())
121120
.setUri(request.constructURL().toString())
122121
.setVersion(HttpVersion.HTTP_1_1)
123122
.setCharset(StandardCharsets.UTF_8);
124-
if (request instanceof Request) {
125-
Request basicRequest = (Request) request;
126-
// builder.setHeader(HttpHeaders.AUTHORIZATION, basicRequest.getAuthString(accessToken));
127-
if (basicRequest.requiresAuthentication()) {
128-
builder.addHeader(HttpHeaders.AUTHORIZATION, basicRequest.getAuthString());
129-
}
130-
} else if (request instanceof BearerTokenRequest) {
131-
BearerTokenRequest bearerTokenRequest = (BearerTokenRequest) request;
132-
if (bearerTokenRequest.requiresAuthentication()) {
133-
builder.addHeader(HttpHeaders.AUTHORIZATION, bearerTokenRequest.getAuthString());
134-
}
123+
124+
if (request.requiresAuthentication()) {
125+
builder.addHeader(HttpHeaders.AUTHORIZATION, request.getAuthString());
135126
}
136127

137128
for (Map.Entry<String, List<String>> entry : request.getHeaderParams().entrySet()) {

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,8 +164,7 @@ public ValidationClient(final String accountSid,
164164
}
165165

166166
@Override
167-
public Response makeRequest(IRequest iRequest) {
168-
Request request = (Request)iRequest;
167+
public Response makeRequest(Request request) {
169168
RequestBuilder builder = RequestBuilder.create(request.getMethod().toString())
170169
.setUri(request.constructURL().toString())
171170
.setVersion(HttpVersion.HTTP_1_1)
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
package com.twilio.http.bearertoken;
2+
3+
import com.twilio.http.HttpClient;
4+
import com.twilio.http.Request;
5+
import com.twilio.http.Response;
6+
import lombok.Getter;
7+
import lombok.Setter;
8+
import org.apache.http.client.RedirectStrategy;
9+
import org.apache.http.client.config.RequestConfig;
10+
import org.apache.http.config.SocketConfig;
11+
import org.apache.http.impl.client.DefaultRedirectStrategy;
12+
13+
public abstract class BearerTokenHttpClient {
14+
// Use constants from HttpClient
15+
public static final RequestConfig DEFAULT_REQUEST_CONFIG = RequestConfig
16+
.custom()
17+
.setConnectTimeout(HttpClient.CONNECTION_TIMEOUT)
18+
.setSocketTimeout(HttpClient.SOCKET_TIMEOUT)
19+
.build();
20+
public static final SocketConfig DEFAULT_SOCKET_CONFIG = SocketConfig
21+
.custom()
22+
.setSoTimeout(HttpClient.SOCKET_TIMEOUT)
23+
.build();
24+
@Getter
25+
@Setter
26+
private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy(new String[0]);
27+
28+
@Getter
29+
private Response lastResponse;
30+
@Getter
31+
private BearerTokenRequest lastRequest;
32+
33+
public Response reliableRequest(final BearerTokenRequest request) {
34+
return reliableRequest(request, HttpClient.RETRY_CODES, HttpClient.RETRIES, HttpClient.DELAY_MILLIS);
35+
}
36+
37+
public Response reliableRequest(final BearerTokenRequest request, final int[] retryCodes, int retries,
38+
final long delayMillis) {
39+
lastRequest = request;
40+
Response response = null;
41+
while (retries > 0) {
42+
response = makeRequest(request);
43+
44+
if (!shouldRetry(response, retryCodes)) {
45+
break;
46+
}
47+
48+
try {
49+
Thread.sleep(delayMillis);
50+
} catch (final InterruptedException e) {
51+
// Delay failed, continue
52+
}
53+
54+
// Decrement retries
55+
retries--;
56+
}
57+
58+
lastResponse = response;
59+
60+
return response;
61+
}
62+
63+
protected boolean shouldRetry(final Response response, final int[] retryCodes) {
64+
if (response == null) {
65+
return true;
66+
}
67+
68+
int statusCode = response.getStatusCode();
69+
int category = (int) Math.floor(statusCode / 100.0);
70+
71+
for (final int retryCode : retryCodes) {
72+
switch (retryCode) {
73+
case HttpClient.ANY_100:
74+
if (category == 1) {
75+
return true;
76+
}
77+
break;
78+
case HttpClient.ANY_200:
79+
if (category == 2) {
80+
return true;
81+
}
82+
break;
83+
case HttpClient.ANY_300:
84+
if (category == 3) {
85+
return true;
86+
}
87+
break;
88+
case HttpClient.ANY_400:
89+
if (category == 4) {
90+
return true;
91+
}
92+
break;
93+
case HttpClient.ANY_500:
94+
if (category == 5) {
95+
return true;
96+
}
97+
break;
98+
default:
99+
if (statusCode == retryCode) {
100+
return true;
101+
}
102+
break;
103+
}
104+
}
105+
return false;
106+
}
107+
108+
public abstract Response makeRequest(final BearerTokenRequest request);
109+
}

0 commit comments

Comments
 (0)