class DuffelAPI::Middlewares::RaiseDuffelErrors
Constants
- EXPECTED_ERROR_STATUSES
- UNEXPECTED_ERROR_STATUSES
Public Instance Methods
on_complete(env)
click to toggle source
Handles a completed (Faraday) request and raises an error, if appropriate
@param [Faraday::Env] env
# File lib/duffel_api/middlewares/raise_duffel_errors.rb, line 14 def on_complete(env) if !json?(env) || UNEXPECTED_ERROR_STATUSES.include?(env.status) response = Response.new(env.response) raise DuffelAPI::Errors::Error.new(generate_error_data(env), response) end if EXPECTED_ERROR_STATUSES.include?(env.status) json_body ||= JSON.parse(env.body) unless env.body.empty? error = json_body["errors"].first error_type = error["type"] error_class = error_class_for_type(error_type) response = Response.new(env.response) raise error_class.new(error, response) end end
Private Instance Methods
error_class_for_type(type)
click to toggle source
Picks the correct error class to use for an error returned by the Duffel API based on its type
@param type [Atom] the type returned by the API @return [Errors::Error]
# File lib/duffel_api/middlewares/raise_duffel_errors.rb, line 40 def error_class_for_type(type) { airline_error: DuffelAPI::Errors::AirlineError, api_error: DuffelAPI::Errors::APIError, authentication_error: DuffelAPI::Errors::AuthenticationError, invalid_request_error: DuffelAPI::Errors::InvalidRequestError, invalid_state_error: DuffelAPI::Errors::InvalidStateError, rate_limit_error: DuffelAPI::Errors::RateLimitError, validation_error: DuffelAPI::Errors::ValidationError, }.fetch(type.to_sym) || DuffelAPI::Errors::Error end
generate_error_data(env)
click to toggle source
Generates error data - specifically a message - based on the ‘Faraday::Env` for non-standard Duffel errors
@param env [Faraday::Env] @return [Hash]
# File lib/duffel_api/middlewares/raise_duffel_errors.rb, line 57 def generate_error_data(env) { "message" => "Something went wrong with this request\n" \ "Code: #{env.status}\n" \ "Headers: #{env.response_headers}\n" \ "Body: #{env.body}", } end
json?(env)
click to toggle source
Works out if the response is a JSON response based on the ‘Faraday::Env`
@param env [Faraday::Env] @return [Boolean]
# File lib/duffel_api/middlewares/raise_duffel_errors.rb, line 70 def json?(env) content_type = env.response_headers["Content-Type"] || env.response_headers["content-type"] || "" content_type.include?("application/json") end