package com.twilio.http; public abstract class HttpClient { public static final int ANY_500 = -500; public static final int ANY_400 = -400; public static final int ANY_300 = -300; public static final int ANY_200 = -200; public static final int ANY_100 = -100; public static final int[] RETRY_CODES = new int[]{ANY_500}; public static final int RETRIES = 3; public static final long DELAY_MILLIS = 100L; /** * Make a request. * * @param request request to make * @return Response of the HTTP request */ public Response reliableRequest(final Request request) { return reliableRequest(request, RETRY_CODES, RETRIES, DELAY_MILLIS); } /** * Make a request. * * @param request request to make * @param retryCodes codes used for retries * @param retries max number of retries * @param delayMillis delays between retries * @return Response of the HTTP request */ public Response reliableRequest(final Request request, final int[] retryCodes, int retries, final long delayMillis) { Response response = null; while (retries > 0) { response = makeRequest(request); if (!shouldRetry(response, retryCodes)) { return response; } try { Thread.sleep(delayMillis); } catch (final InterruptedException e) { // Delay failed, continue } // Decrement retries retries--; } 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 ANY_100: if (category == 1) { return true; } break; case ANY_200: if (category == 2) { return true; } break; case ANY_300: if (category == 3) { return true; } break; case ANY_400: if (category == 4) { return true; } break; case ANY_500: if (category == 5) { return true; } break; default: if (statusCode == retryCode) { return true; } break; } } return false; } public abstract Response makeRequest(final Request request); }