3535import com .createsend .util .exceptions .CreateSendHttpException ;
3636import com .createsend .util .exceptions .ExpiredOAuthTokenException ;
3737import com .createsend .util .exceptions .NotFoundException ;
38+ import com .createsend .util .exceptions .RateLimitingException ;
3839import com .createsend .util .exceptions .ServerErrorException ;
3940import com .createsend .util .exceptions .UnauthorisedException ;
4041import com .createsend .util .jersey .AuthorisedResourceFactory ;
4142import com .createsend .util .jersey .JsonProvider ;
4243import com .createsend .util .jersey .ResourceFactory ;
4344import com .createsend .util .jersey .UnauthorisedResourceFactory ;
4445import com .createsend .util .jersey .UserAgentFilter ;
46+ import com .fasterxml .jackson .databind .ObjectMapper ;
4547import com .sun .jersey .api .client .Client ;
4648import com .sun .jersey .api .client .ClientResponse ;
4749import com .sun .jersey .api .client .GenericType ;
@@ -80,6 +82,7 @@ public class JerseyClientImpl implements JerseyClient {
8082 }
8183
8284 private ErrorDeserialiser <String > defaultDeserialiser = new ErrorDeserialiser <String >(){};
85+ private ObjectMapper mapper = new ObjectMapper ();
8386 private ResourceFactory authorisedResourceFactory ;
8487 private AuthenticationDetails authDetails ;
8588
@@ -407,9 +410,22 @@ private <T> CreateSendException handleErrorResponse(UniformInterfaceException ue
407410 ErrorDeserialiser <T > deserialiser ) {
408411 ClientResponse response = ue .getResponse ();
409412 ApiErrorResponse <T > apiResponse = null ;
410-
413+
414+ int statusCode = response .getStatus ();
411415 Status responseStatus = response .getClientResponseStatus ();
412- if (responseStatus == Status .BAD_REQUEST ||
416+
417+ // There are some HTTP Responses which Jersey does not handle correctly: both the HTTP
418+ // Status Code and response payloads.
419+ if (responseStatus == null ) {
420+ try {
421+ // Use Jackson directly to deserialise the reponse payload
422+ apiResponse = mapper .readValue (response .getEntityInputStream (), ApiErrorResponse .class );
423+ } catch (Throwable t ) { }
424+
425+ return handleUnknownStatusError (statusCode , apiResponse );
426+ }
427+
428+ if (responseStatus == Status .BAD_REQUEST ||
413429 responseStatus == Status .NOT_FOUND ||
414430 responseStatus == Status .UNAUTHORIZED ||
415431 responseStatus == Status .INTERNAL_SERVER_ERROR ) {
@@ -419,16 +435,30 @@ private <T> CreateSendException handleErrorResponse(UniformInterfaceException ue
419435 }
420436
421437 if (apiResponse == null ) {
422- return handleUnknownError (responseStatus );
438+ return handleUnknownError (statusCode );
423439 } else if (apiResponse .error != null && apiResponse .error .length () > 0 ) {
424440 return handleOAuthErrorResponse (responseStatus , apiResponse );
425441 } else {
426- return handleAPIErrorResponse (responseStatus , apiResponse );
442+ return handleAPIErrorResponse (responseStatus , apiResponse );
443+ }
444+ }
445+
446+ private <T > CreateSendException handleUnknownStatusError (int httpStatusCode , ApiErrorResponse <T > apiResponse ) {
447+ boolean hasMessage = apiResponse != null && apiResponse .Message != null ;
448+
449+ // Jersey does not yet handle HTTP Status Codes of 429:Too Many Requests
450+ if (httpStatusCode == 429 ) {
451+ return new RateLimitingException (httpStatusCode , hasMessage ? apiResponse .Message : null );
452+ }
453+
454+ if (hasMessage ) {
455+ return new CreateSendHttpException (apiResponse .Message , httpStatusCode );
427456 }
457+ return new CreateSendHttpException (httpStatusCode );
428458 }
429459
430- private <T > CreateSendException handleUnknownError (Status responseStatus ) {
431- return new CreateSendHttpException (responseStatus );
460+ private <T > CreateSendException handleUnknownError (int httpStatusCode ) {
461+ return new CreateSendHttpException (httpStatusCode );
432462 }
433463
434464 private <T > CreateSendException handleAPIErrorResponse (
@@ -445,7 +475,7 @@ private <T> CreateSendException handleAPIErrorResponse(
445475 return new ExpiredOAuthTokenException (apiResponse .Code , apiResponse .Message );
446476 return new UnauthorisedException (apiResponse .Code , apiResponse .Message );
447477 default :
448- return new CreateSendHttpException (responseStatus );
478+ return new CreateSendHttpException (responseStatus . getStatusCode () );
449479 }
450480 }
451481
0 commit comments