# frozen_string_literal: true require 'creditsafe/authenticate' require 'creditsafe/version' require 'creditsafe/errors' module Creditsafe class FaradayAuth < Faraday::Middleware def initialize(app, username, password, options = {}) super(app) @username = username @password = password @token = nil @options = options end def call(env) retry_count = 0 authenticate! unless @token begin env[:request_headers]['Authorization'] = @token env[:request_headers]['Content-Type'] = 'application/json' env[:request_headers]['User-Agent'] = "finpoint/#{Creditsafe::VERSION}" @app.call(env).tap do |resp| if resp.status == 401 raise Creditsafe::UnauthorizedError, resp.body end end rescue Creditsafe::UnauthorizedError => e retry_count += 1 if retry_count <= 1 authenticate! retry else raise e end end end private def authenticate! @token = Authenticate.new.call(@username, @password) end end end