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