class JsonApiClient::Middleware::Status

Public Class Methods

new(app, options) click to toggle source
Calls superclass method
# File lib/json_api_client/middleware/status.rb, line 4
def initialize(app, options)
  super(app)
  @options = options
end

Public Instance Methods

call(environment) click to toggle source
# File lib/json_api_client/middleware/status.rb, line 9
def call(environment)
  @app.call(environment).on_complete do |env|
    handle_status(env[:status], env)

    # look for meta[:status]
    if env[:body].is_a?(Hash)
      code = env[:body].fetch("meta", {}).fetch("status", 200).to_i
      handle_status(code, env)
    end
  end
rescue Faraday::ConnectionFailed, Faraday::TimeoutError => e
  raise Errors::ConnectionError.new environment, e.to_s
end

Private Instance Methods

custom_handler_for(code) click to toggle source
# File lib/json_api_client/middleware/status.rb, line 25
def custom_handler_for(code)
  @options.fetch(:custom_handlers, {})[code]
end
handle_status(code, env) click to toggle source
# File lib/json_api_client/middleware/status.rb, line 29
def handle_status(code, env)
  custom_handler = custom_handler_for(code)
  return custom_handler.call(env) if custom_handler.present?

  case code
  when 200..399
  when 401
    raise Errors::NotAuthorized, env
  when 403
    raise Errors::AccessDenied, env
  when 404
    raise Errors::NotFound, env
  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
    raise Errors::UnexpectedStatus.new(code, env[:url])
  end
end