# 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 request_body = env[:body] authenticate! unless @token begin env[:request_headers]['Authorization'] = @token env[:request_headers]['Content-Type'] = 'application/json' env[:request_headers]['User-Agent'] = "finpoint/#{Creditsafe::VERSION}" # after failure env[:body] is set to the response body env[:body] = request_body @app.call(env).tap do |resp| raise Creditsafe::UnauthorizedError, resp.body if resp.status == 401 end rescue Creditsafe::UnauthorizedError => e retry_count += 1 raise e if retry_count > 1 authenticate! retry end end private def authenticate! @token = Authenticate.new.call(@username, @password) end end end