Skip to content

fix: added new httpclient for noauth and bearertoken requests #808

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Aug 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading