Skip to content

Commit

Permalink
fix: added new httpclient for noauth and bearertoken requests (#808)
Browse files Browse the repository at this point in the history
* added new httpclient for noauth and bearertoken requests
  • Loading branch information
sbansla authored Aug 13, 2024
1 parent ab74cef commit d47fbe1
Show file tree
Hide file tree
Showing 10 changed files with 533 additions and 153 deletions.
9 changes: 4 additions & 5 deletions src/main/java/com/twilio/http/HttpClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,15 +39,15 @@ public abstract class HttpClient {
@Getter
private Response lastResponse;
@Getter
private IRequest lastRequest;
private Request lastRequest;

/**
* Make a request.
*
* @param request request to make
* @return Response of the HTTP request
*/
public Response reliableRequest(final IRequest request) {
public Response reliableRequest(final Request request) {
return reliableRequest(request, RETRY_CODES, RETRIES, DELAY_MILLIS);
}

Expand All @@ -60,7 +60,7 @@ public Response reliableRequest(final IRequest request) {
* @param delayMillis delays between retries
* @return Response of the HTTP request
*/
public Response reliableRequest(final IRequest request, final int[] retryCodes, int retries,
public Response reliableRequest(final Request request, final int[] retryCodes, int retries,
final long delayMillis) {
lastRequest = request;
Response response = null;
Expand Down Expand Up @@ -131,6 +131,5 @@ protected boolean shouldRetry(final Response response, final int[] retryCodes) {
return false;
}

public abstract <T extends IRequest> Response makeRequest(final T request);

public abstract Response makeRequest(final Request request);
}
35 changes: 13 additions & 22 deletions src/main/java/com/twilio/http/NetworkHttpClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,14 @@
import com.twilio.Twilio;
import com.twilio.constant.EnumConstants;
import com.twilio.exception.ApiException;
import com.twilio.http.bearertoken.BearerTokenRequest;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.apache.http.HttpEntity;
import org.apache.http.HttpHeaders;
import org.apache.http.HttpResponse;
Expand All @@ -19,13 +26,6 @@
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicHeader;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;

public class NetworkHttpClient extends HttpClient {

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

Expand Down Expand Up @@ -114,24 +113,16 @@ public NetworkHttpClient(HttpClientBuilder clientBuilder) {
* @param request request to make
* @return Response of the HTTP request
*/
public <T extends IRequest> Response makeRequest(final T request) {
public Response makeRequest(final Request request) {

HttpMethod method = request.getMethod();
RequestBuilder builder = RequestBuilder.create(method.toString())
.setUri(request.constructURL().toString())
.setVersion(HttpVersion.HTTP_1_1)
.setCharset(StandardCharsets.UTF_8);
if (request instanceof Request) {
Request basicRequest = (Request) request;
// builder.setHeader(HttpHeaders.AUTHORIZATION, basicRequest.getAuthString(accessToken));
if (basicRequest.requiresAuthentication()) {
builder.addHeader(HttpHeaders.AUTHORIZATION, basicRequest.getAuthString());
}
} else if (request instanceof BearerTokenRequest) {
BearerTokenRequest bearerTokenRequest = (BearerTokenRequest) request;
if (bearerTokenRequest.requiresAuthentication()) {
builder.addHeader(HttpHeaders.AUTHORIZATION, bearerTokenRequest.getAuthString());
}

if (request.requiresAuthentication()) {
builder.addHeader(HttpHeaders.AUTHORIZATION, request.getAuthString());
}

for (Map.Entry<String, List<String>> entry : request.getHeaderParams().entrySet()) {
Expand Down
3 changes: 1 addition & 2 deletions src/main/java/com/twilio/http/ValidationClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -164,8 +164,7 @@ public ValidationClient(final String accountSid,
}

@Override
public Response makeRequest(IRequest iRequest) {
Request request = (Request)iRequest;
public Response makeRequest(Request request) {
RequestBuilder builder = RequestBuilder.create(request.getMethod().toString())
.setUri(request.constructURL().toString())
.setVersion(HttpVersion.HTTP_1_1)
Expand Down
109 changes: 109 additions & 0 deletions src/main/java/com/twilio/http/bearertoken/BearerTokenHttpClient.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
package com.twilio.http.bearertoken;

import com.twilio.http.HttpClient;
import com.twilio.http.Request;
import com.twilio.http.Response;
import lombok.Getter;
import lombok.Setter;
import org.apache.http.client.RedirectStrategy;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.config.SocketConfig;
import org.apache.http.impl.client.DefaultRedirectStrategy;

public abstract class BearerTokenHttpClient {
// Use constants from HttpClient
public static final RequestConfig DEFAULT_REQUEST_CONFIG = RequestConfig
.custom()
.setConnectTimeout(HttpClient.CONNECTION_TIMEOUT)
.setSocketTimeout(HttpClient.SOCKET_TIMEOUT)
.build();
public static final SocketConfig DEFAULT_SOCKET_CONFIG = SocketConfig
.custom()
.setSoTimeout(HttpClient.SOCKET_TIMEOUT)
.build();
@Getter
@Setter
private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy(new String[0]);

@Getter
private Response lastResponse;
@Getter
private BearerTokenRequest lastRequest;

public Response reliableRequest(final BearerTokenRequest request) {
return reliableRequest(request, HttpClient.RETRY_CODES, HttpClient.RETRIES, HttpClient.DELAY_MILLIS);
}

public Response reliableRequest(final BearerTokenRequest request, final int[] retryCodes, int retries,
final long delayMillis) {
lastRequest = request;
Response response = null;
while (retries > 0) {
response = makeRequest(request);

if (!shouldRetry(response, retryCodes)) {
break;
}

try {
Thread.sleep(delayMillis);
} catch (final InterruptedException e) {
// Delay failed, continue
}

// Decrement retries
retries--;
}

lastResponse = response;

return response;
}

protected boolean shouldRetry(final Response response, final int[] retryCodes) {
if (response == null) {
return true;
}

int statusCode = response.getStatusCode();
int category = (int) Math.floor(statusCode / 100.0);

for (final int retryCode : retryCodes) {
switch (retryCode) {
case HttpClient.ANY_100:
if (category == 1) {
return true;
}
break;
case HttpClient.ANY_200:
if (category == 2) {
return true;
}
break;
case HttpClient.ANY_300:
if (category == 3) {
return true;
}
break;
case HttpClient.ANY_400:
if (category == 4) {
return true;
}
break;
case HttpClient.ANY_500:
if (category == 5) {
return true;
}
break;
default:
if (statusCode == retryCode) {
return true;
}
break;
}
}
return false;
}

public abstract Response makeRequest(final BearerTokenRequest request);
}
Loading

0 comments on commit d47fbe1

Please sign in to comment.