diff --git a/pom.xml b/pom.xml
index 3697e5e..344edb5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
com.aftership
tracking-sdk
- 7.0.0
+ 7.1.0
AfterShip Tracking SDK
The official AfterShip Tracking Java API library
diff --git a/src/main/java/com/aftership/exception/ApiException.java b/src/main/java/com/aftership/exception/ApiException.java
index ab8a1fe..9b3416f 100644
--- a/src/main/java/com/aftership/exception/ApiException.java
+++ b/src/main/java/com/aftership/exception/ApiException.java
@@ -4,13 +4,18 @@
*/
package com.aftership.exception;
+import org.apache.http.Header;
+
+import java.util.Arrays;
+
public class ApiException extends Exception {
- private Integer metaCode;
- private String message;
- private Integer code;
- private Integer statusCode;
- private String responseBody;
+ private final Integer metaCode;
+ private final String message;
+ private final Integer code;
+ private final Integer statusCode;
+ private final String responseBody;
+ private final Header[] headers;
public ApiException(final int code, final String message) {
this.metaCode = 0;
@@ -18,56 +23,48 @@ public ApiException(final int code, final String message) {
this.statusCode = 0;
this.code = code;
this.responseBody = "";
+ this.headers = null;
}
- public ApiException(final int metaCode, final String message, final int code, final int statusCode,
- final String responseBody) {
+ public ApiException(
+ final int metaCode,
+ final String message,
+ final int code,
+ final int statusCode,
+ final String responseBody,
+ final Header[] headers
+ ) {
this.metaCode = metaCode;
this.message = message;
this.code = code;
this.statusCode = statusCode;
this.responseBody = responseBody;
+ this.headers = headers;
}
public Integer getMetaCode() {
return metaCode;
}
- public void setMetaCode(Integer metaCode) {
- this.metaCode = metaCode;
- }
-
@Override
public String getMessage() {
return message;
}
- public void setMessage(String message) {
- this.message = message;
- }
-
public Integer getCode() {
return code;
}
- public void setCode(Integer code) {
- this.code = code;
- }
-
public Integer getStatusCode() {
return statusCode;
}
- public void setStatusCode(Integer statusCode) {
- this.statusCode = statusCode;
- }
-
public String getResponseBody() {
return responseBody;
}
- public void setResponseBody(String responseBody) {
- this.responseBody = responseBody;
+ public Header[] getHeaders() {
+ return headers;
}
@Override
@@ -78,6 +75,7 @@ public String toString() {
", code=" + code +
", statusCode=" + statusCode +
", responseBody='" + responseBody + '\'' +
+ ", headers=" + Arrays.toString(headers) +
'}';
}
}
diff --git a/src/main/java/com/aftership/http/AfterShipClient.java b/src/main/java/com/aftership/http/AfterShipClient.java
index 79cec0d..2d7e02f 100644
--- a/src/main/java/com/aftership/http/AfterShipClient.java
+++ b/src/main/java/com/aftership/http/AfterShipClient.java
@@ -57,10 +57,24 @@ public Response request(final Request request) throws Exception {
message = jsonObject.get("meta").getAsJsonObject().get("message").getAsString();
} catch (Exception ignore) {
}
- throw new ApiException(metaCode, message, statusCode, ErrorEnum.getByMetaCode(metaCode), response.getContent());
+ throw new ApiException(
+ metaCode,
+ message,
+ statusCode,
+ ErrorEnum.getByMetaCode(metaCode),
+ response.getContent(),
+ response.getHeaders()
+ );
}
if (statusCode > 499) {
- throw new ApiException(ErrorEnum.UNKNOWN_ERROR.getCode(), ErrorEnum.UNKNOWN_ERROR.getMessage(), ErrorEnum.UNKNOWN_ERROR.getStatusCode(), 0, "");
+ throw new ApiException(
+ ErrorEnum.UNKNOWN_ERROR.getCode(),
+ ErrorEnum.UNKNOWN_ERROR.getMessage(),
+ ErrorEnum.UNKNOWN_ERROR.getStatusCode(),
+ 0,
+ "",
+ response.getHeaders()
+ );
}
return response;
}
diff --git a/src/main/java/com/aftership/http/HttpClient.java b/src/main/java/com/aftership/http/HttpClient.java
index 7580531..7b06c59 100644
--- a/src/main/java/com/aftership/http/HttpClient.java
+++ b/src/main/java/com/aftership/http/HttpClient.java
@@ -6,7 +6,10 @@
import com.aftership.constant.ErrorEnum;
import com.aftership.exception.ApiException;
-import org.apache.http.*;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpHeaders;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpVersion;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.client.utils.HttpClientUtils;
@@ -24,16 +27,10 @@
public class HttpClient {
- private static final String RATE_LIMIT_RESET = "x-ratelimit-reset";
- private static final String RATE_LIMIT_LIMIT = "x-ratelimit-limit";
- private static final String RATE_LIMIT_REMAINING = "x-ratelimit-remaining";
-
- private static final String DEFAULT_USER_AGENT = "aftership-sdk-java/7.0.0 (https://www.aftership.com) apache-httpclient/4.5.14";
+ private static final String DEFAULT_USER_AGENT = "aftership-sdk-java/7.1.0 (https://www.aftership.com) apache-httpclient/4.5.14";
protected final org.apache.http.client.HttpClient client;
private final String domain;
- private RateLimit rateLimit;
-
public HttpClient(final RequestConfig requestConfig, String userAgent, String domain) {
this.domain = domain;
if (userAgent == null || userAgent.isEmpty()) {
@@ -53,7 +50,34 @@ public HttpClient(final RequestConfig requestConfig, String userAgent, String do
.build();
}
- public Response makeRequest(final Request request) throws Exception {
+ public Response request(final Request request, int retries) throws Exception {
+ Response response = null;
+ int i = 0;
+ while (i <= retries) {
+ try {
+ i++;
+ response = makeRequest(request);
+ if (!shouldRetry(response)) {
+ break;
+ }
+ } catch (SocketTimeoutException e) {
+ if (i > retries) {
+ throw new ApiException(
+ 0,
+ ErrorEnum.TIMED_OUT.getMessage(),
+ ErrorEnum.TIMED_OUT.getCode(),
+ ErrorEnum.TIMED_OUT.getStatusCode(),
+ e.getMessage(),
+ null
+ );
+ }
+ }
+ Thread.sleep(delay(i));
+ }
+ return response;
+ }
+
+ private Response makeRequest(final Request request) throws Exception {
HttpMethod method = request.getMethod();
RequestBuilder builder = RequestBuilder.create(method.toString())
.setUri(this.domain + request.getURL())
@@ -70,7 +94,12 @@ public Response makeRequest(final Request request) throws Exception {
try {
response = client.execute(builder.build());
HttpEntity entity = response.getEntity();
- return new Response(EntityUtils.toString(entity), response.getStatusLine().getStatusCode(), false);
+ return new Response(
+ EntityUtils.toString(entity),
+ response.getStatusLine().getStatusCode(),
+ false,
+ response.getAllHeaders()
+ );
} finally {
if (response != null) {
HttpClientUtils.closeQuietly(response);
@@ -78,26 +107,6 @@ public Response makeRequest(final Request request) throws Exception {
}
}
- public Response request(final Request request, int retries) throws Exception {
- Response response = null;
- int i = 0;
- while (i <= retries) {
- try {
- i++;
- response = makeRequest(request);
- if (!shouldRetry(response)) {
- break;
- }
- } catch (SocketTimeoutException e) {
- if (i > retries) {
- throw new ApiException(0, ErrorEnum.TIMED_OUT.getMessage(), ErrorEnum.TIMED_OUT.getCode(), ErrorEnum.TIMED_OUT.getStatusCode(), e.getMessage());
- }
- }
- Thread.sleep(delay(i));
- }
- return response;
- }
-
private boolean shouldRetry(Response response) {
if (response.isTimeout()) {
return true;
@@ -111,24 +120,4 @@ private int delay(int retryAttempt) {
double jitter = delay * (Math.random() - 0.5);
return (int) (Math.max(1, delay + jitter) * 1000);
}
-
- private void setRateLimiting(HttpResponse response) {
- if (response == null) {
- return;
- }
- RateLimit rateLimit = new RateLimit();
- Header limit = response.getFirstHeader(RATE_LIMIT_LIMIT);
- if (limit != null) {
- rateLimit.setLimit(Integer.parseInt(limit.getValue()));
- }
- Header reset = response.getFirstHeader(RATE_LIMIT_RESET);
- if (reset != null) {
- rateLimit.setReset(Long.parseLong(reset.getValue()));
- }
- Header remaining = response.getFirstHeader(RATE_LIMIT_REMAINING);
- if (remaining != null) {
- rateLimit.setRemaining(Integer.parseInt(remaining.getValue()));
- }
- this.rateLimit = rateLimit;
- }
}
diff --git a/src/main/java/com/aftership/http/Response.java b/src/main/java/com/aftership/http/Response.java
index 444d031..ffdc801 100644
--- a/src/main/java/com/aftership/http/Response.java
+++ b/src/main/java/com/aftership/http/Response.java
@@ -4,21 +4,26 @@
*/
package com.aftership.http;
+import org.apache.http.Header;
+
public class Response {
private final int statusCode;
private final String content;
private final boolean isTimeout;
+ private final Header[] headers;
public Response() {
this.statusCode = 0;
this.content = "";
this.isTimeout = true;
+ this.headers = null;
}
- public Response(String content, int statusCode, boolean isTimeout) {
+ public Response(String content, int statusCode, boolean isTimeout, Header[] headers) {
this.content = content;
this.statusCode = statusCode;
this.isTimeout = isTimeout;
+ this.headers = headers;
}
public String getContent() {
@@ -32,4 +37,8 @@ public int getStatusCode() {
public boolean isTimeout() {
return isTimeout;
}
+
+ public Header[] getHeaders() {
+ return headers;
+ }
}