diff --git a/lib/json_api_client/errors.rb b/lib/json_api_client/errors.rb index 712b9900..795235c4 100644 --- a/lib/json_api_client/errors.rb +++ b/lib/json_api_client/errors.rb @@ -44,6 +44,28 @@ class AccessDenied < ClientError class NotAuthorized < ClientError end + class NotFound < ClientError + attr_reader :uri + def initialize(uri) + @uri = uri + + msg = "Couldn't find resource at: #{uri.to_s}" + super nil, msg + end + end + + class RequestTimeout < ClientError + end + + class Conflict < ClientError + def initialize(env, msg = 'Resource already exists') + super env, msg + end + end + + class TooManyRequests < ClientError + end + class ConnectionError < ApiError end @@ -59,23 +81,16 @@ def initialize(env, msg = nil) end end - class Conflict < ServerError - def initialize(env, msg = 'Resource already exists') - super env, msg - end + class InternalServerError < ServerError end - class NotFound < ServerError - attr_reader :uri - def initialize(uri) - @uri = uri + class BadGateway < ServerError + end - msg = "Couldn't find resource at: #{uri.to_s}" - super nil, msg - end + class ServiceUnavailable < ServerError end - class InternalServerError < ServerError + class GatewayTimeout < ServerError end class UnexpectedStatus < ServerError diff --git a/lib/json_api_client/middleware/status.rb b/lib/json_api_client/middleware/status.rb index 223f4aa3..37f69a70 100644 --- a/lib/json_api_client/middleware/status.rb +++ b/lib/json_api_client/middleware/status.rb @@ -38,14 +38,24 @@ def handle_status(code, env) raise Errors::AccessDenied, env when 404 raise Errors::NotFound, env[:url] + when 408 + raise Errors::RequestTimeout, env when 409 raise Errors::Conflict, env when 422 # Allow to proceed as resource errors will be populated + when 429 + raise Errors::TooManyRequests, env when 400..499 raise Errors::ClientError, env when 500 raise Errors::InternalServerError, env + when 502 + raise Errors::BadGateway, env + when 503 + raise Errors::ServiceUnavailable, env + when 504 + raise Errors::GatewayTimeout, env when 501..599 raise Errors::ServerError, env else diff --git a/test/unit/errors_test.rb b/test/unit/errors_test.rb index 0627f134..6d533598 100644 --- a/test/unit/errors_test.rb +++ b/test/unit/errors_test.rb @@ -96,6 +96,51 @@ def test_not_authorized end end + def test_request_timeout + stub_request(:get, "http://example.com/users") + .to_return(headers: {content_type: "text/plain"}, status: 408, body: "request timeout") + + assert_raises JsonApiClient::Errors::RequestTimeout do + User.all + end + end + + def test_too_many_requests + stub_request(:get, "http://example.com/users") + .to_return(headers: {content_type: "text/plain"}, status: 429, body: "too many requests") + + assert_raises JsonApiClient::Errors::TooManyRequests do + User.all + end + end + + def test_bad_gateway + stub_request(:get, "http://example.com/users") + .to_return(headers: {content_type: "text/plain"}, status: 502, body: "bad gateway") + + assert_raises JsonApiClient::Errors::BadGateway do + User.all + end + end + + def test_service_unavailable + stub_request(:get, "http://example.com/users") + .to_return(headers: {content_type: "text/plain"}, status: 503, body: "service unavailable") + + assert_raises JsonApiClient::Errors::ServiceUnavailable do + User.all + end + end + + def test_gateway_timeout + stub_request(:get, "http://example.com/users") + .to_return(headers: {content_type: "text/plain"}, status: 504, body: "gateway timeout") + + assert_raises JsonApiClient::Errors::GatewayTimeout do + User.all + end + end + def test_errors_are_rescuable_by_default_rescue begin raise JsonApiClient::Errors::ApiError, "Something bad happened"