Class: Legion::Extensions::Github::Middleware::CredentialFallback

Inherits:
Faraday::Middleware
  • Object
show all
Defined in:
lib/legion/extensions/github/middleware/credential_fallback.rb

Constant Summary collapse

RETRYABLE_STATUSES =
[403, 429].freeze
IDEMPOTENT_METHODS =
%w[GET HEAD OPTIONS PUT DELETE].freeze

Instance Method Summary collapse

Constructor Details

#initialize(app, resolver: nil) ⇒ CredentialFallback

Returns a new instance of CredentialFallback.



13
14
15
16
# File 'lib/legion/extensions/github/middleware/credential_fallback.rb', line 13

def initialize(app, resolver: nil)
  super(app)
  @resolver = resolver
end

Instance Method Details

#call(env) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/legion/extensions/github/middleware/credential_fallback.rb', line 18

def call(env)
  response = @app.call(env)
  return response unless should_retry?(response)

  retries = 0
  max = @resolver.respond_to?(:max_fallback_retries) ? @resolver.max_fallback_retries : 3

  while retries < max && should_retry?(response)
    notify_resolver(response)

    owner, repo = extract_owner_repo_from_env(env)
    next_credential = @resolver&.resolve_next_credential(owner: owner, repo: repo)
    break unless next_credential

    env[:request_headers]['Authorization'] = "Bearer #{next_credential[:token]}"

    response = @app.call(env)
    retries += 1
  end

  response
end