# frozen_string_literal: true module EvilMartiansAPI module Middleware # Handle HTTP errors by inspecting the HTTP response code and raising appropriate custom errors. # # @raise [Errors::ClientError, Errors::ServerError] Raises a coded ClientError or ServerError. # class RaiseHttpErrorMiddleware < Faraday::Middleware CLIENT_ERRORS = { 400 => Errors::InvalidRequestError, 401 => Errors::UnauthorizedError, 403 => Errors::ForbiddenError, 404 => Errors::NotFoundError, 413 => Errors::PayloadTooLargeError, 422 => Errors::UnprocessableEntityError, 429 => Errors::TooManyRequestsError, }.freeze def on_complete(env) handle_client_error(env) handle_server_error(env) end private def handle_client_error(env) return if env.status < 400 || env.status >= 500 error = CLIENT_ERRORS.fetch(env.status, Errors::ClientError) raise error, message(env) end def handle_server_error(env) return if env.status < 500 raise Errors::ServerError, message(env) end def message(env) "Server returned #{env.status}: #{env.body}. Headers: #{headers(env)}" end def headers(env) env.response_headers.inspect end Faraday::Middleware.register_middleware(evil_martians_api_raise_http_error: self) end end end