diff --git a/src/main/java/com/easypost/model/EventDeserializer.java b/src/main/java/com/easypost/model/EventDeserializer.java index 8749a7407..e4cb34ff2 100644 --- a/src/main/java/com/easypost/model/EventDeserializer.java +++ b/src/main/java/com/easypost/model/EventDeserializer.java @@ -89,8 +89,8 @@ private Object deserializeJsonElement(final JsonElement element) { } else if (element.isJsonArray()) { return deserializeJsonArray(element.getAsJsonArray()); } else { - System.err.printf("Unknown JSON element type for element %s. Please email us at %s.%n", - element.toString(), EasyPostResource.EASYPOST_SUPPORT_EMAIL); + System.err.printf("Unknown JSON element type for element %s. Please email us at %s.%n", element, + EasyPostResource.EASYPOST_SUPPORT_EMAIL); return null; } } diff --git a/src/main/java/com/easypost/model/Shipment.java b/src/main/java/com/easypost/model/Shipment.java index 0e0f983e6..71c5fe133 100644 --- a/src/main/java/com/easypost/model/Shipment.java +++ b/src/main/java/com/easypost/model/Shipment.java @@ -787,9 +787,9 @@ public List getSmartrates(final String apiKey) throws EasyPostException { * @throws EasyPostException when the request fails. */ public List getSmartrates(final Map params, final String apiKey) throws EasyPostException { - SmartrateCollection smartrateCollection = request(RequestMethod.GET, - String.format("%s/smartrate", instanceURL(Shipment.class, this.getId())), params, - SmartrateCollection.class, apiKey); + SmartrateCollection smartrateCollection = + request(RequestMethod.GET, String.format("%s/smartrate", instanceURL(Shipment.class, this.getId())), + params, SmartrateCollection.class, apiKey); return smartrateCollection.getRates(); } diff --git a/src/main/java/com/easypost/net/EasyPostResource.java b/src/main/java/com/easypost/net/EasyPostResource.java index ead83b36f..db92bd736 100644 --- a/src/main/java/com/easypost/net/EasyPostResource.java +++ b/src/main/java/com/easypost/net/EasyPostResource.java @@ -59,10 +59,12 @@ public abstract class EasyPostResource { new ArrayList<>(Arrays.asList("getCreatedAt", "getUpdatedAt", "getFees")); private static final int DEFAULT_CONNECT_TIMEOUT_MILLISECONDS = 30000; private static final int DEFAULT_READ_TIMEOUT_MILLISECONDS = 60000; - private static final double APP_ENGINE_DEFAULT_TIMEOUT_SECONDS = 20.0; + private static final double DEFAULT_APP_ENGINE_TIMEOUT_SECONDS = 20.0; private static final String DNS_CACHE_TTL_PROPERTY_NAME = "networkaddress.cache.ttl"; - // Set this property to override your environment's default URLStreamHandler. private static final String CUSTOM_URL_STREAM_HANDLER_PROPERTY_NAME = "com.easypost.net.customURLStreamHandler"; + private static int connectTimeoutMilliseconds = DEFAULT_CONNECT_TIMEOUT_MILLISECONDS; + private static int readTimeoutMilliseconds = DEFAULT_READ_TIMEOUT_MILLISECONDS; + private static double appEngineTimeoutSeconds = DEFAULT_APP_ENGINE_TIMEOUT_SECONDS; private Date createdAt; private Date updatedAt; private ArrayList fees; @@ -150,13 +152,13 @@ private static javax.net.ssl.HttpsURLConnection createEasyPostConnection(final S easypostURL = new URL(url); } javax.net.ssl.HttpsURLConnection conn = (javax.net.ssl.HttpsURLConnection) easypostURL.openConnection(); - conn.setConnectTimeout(DEFAULT_CONNECT_TIMEOUT_MILLISECONDS); + conn.setConnectTimeout(getConnectTimeoutMilliseconds()); int readTimeout; if (EasyPost.readTimeout != 0) { readTimeout = EasyPost.readTimeout; } else { - readTimeout = DEFAULT_READ_TIMEOUT_MILLISECONDS; + readTimeout = getReadTimeoutMilliseconds(); } conn.setReadTimeout(readTimeout); @@ -470,7 +472,7 @@ private static EasyPostResponse makeAppEngineRequest(final RequestMethod method, // Heroku times out after 30s, so leave some time for the API to return a response fetchOptionsClass.getDeclaredMethod("setDeadline", java.lang.Double.class) - .invoke(fetchOptions, APP_ENGINE_DEFAULT_TIMEOUT_SECONDS); + .invoke(fetchOptions, getAppEngineTimeoutSeconds()); Class requestClass = Class.forName("com.google.appengine.api.urlfetch.HTTPRequest"); @@ -525,6 +527,60 @@ private static EasyPostResponse makeAppEngineRequest(final RequestMethod method, } } + /** + * Get the timeout in milliseconds for connecting to the API. + * + * @return the timeout in milliseconds + */ + public static int getConnectTimeoutMilliseconds() { + return connectTimeoutMilliseconds; + } + + /** + * Set the timeout in milliseconds for connecting to the API. + * + * @param milliseconds the timeout in milliseconds + */ + public static void setConnectTimeoutMilliseconds(int milliseconds) { + connectTimeoutMilliseconds = milliseconds; + } + + /** + * Get the timeout in milliseconds for reading API responses. + * + * @return the timeout in milliseconds + */ + public static int getReadTimeoutMilliseconds() { + return readTimeoutMilliseconds; + } + + /** + * Set the timeout in milliseconds for reading API responses. + * + * @param milliseconds the timeout in milliseconds + */ + public static void setReadTimeoutMilliseconds(int milliseconds) { + readTimeoutMilliseconds = milliseconds; + } + + /** + * Get the timeout in milliseconds for App Engine API requests. + * + * @return the timeout in milliseconds + */ + public static double getAppEngineTimeoutSeconds() { + return appEngineTimeoutSeconds; + } + + /** + * Set the timeout in seconds for App Engine API requests. + * + * @param seconds the timeout in seconds + */ + public static void setAppEngineTimeoutSeconds(double seconds) { + appEngineTimeoutSeconds = seconds; + } + /** * Returns a string representation of the object. */ @@ -703,7 +759,6 @@ protected enum RequestMethod { PUT } - // represents Errors returned as JSON private static class ErrorContainer { private EasyPostResource.Error error; } diff --git a/src/test/java/com/easypost/EasyPostTest.java b/src/test/java/com/easypost/EasyPostTest.java index e3e9b6e13..07ce8925b 100644 --- a/src/test/java/com/easypost/EasyPostTest.java +++ b/src/test/java/com/easypost/EasyPostTest.java @@ -1070,6 +1070,17 @@ public void testScanForm() throws EasyPostException { assertEquals("IDs do not match", scanForms.getScanForms().get(0).getId(), scanForm.getId()); } + @Test + public void testClientTimeout() throws EasyPostException { + int timeout = 1; + Order.setConnectTimeoutMilliseconds(timeout); + Order.setReadTimeoutMilliseconds(timeout); + Order.setAppEngineTimeoutSeconds(timeout); + assertEquals(Order.getConnectTimeoutMilliseconds(), timeout); + assertEquals(Order.getReadTimeoutMilliseconds(), timeout); + assertEquals(Order.getAppEngineTimeoutSeconds(), timeout, 0.001); + } + //This test needs to have new set of dates to avoid "report already exists" error /*