Class: OmniauthOpenidFederation::HttpClient

Inherits:
Object
  • Object
show all
Defined in:
lib/omniauth_openid_federation/http_client.rb

Class Method Summary collapse

Class Method Details

.get(uri, options = {}) ⇒ HTTP::Response

Execute an HTTP GET request with retry logic

Parameters:

  • uri (String, URI)

    The URI to fetch

  • options (Hash) (defaults to: {})

    Request options

Options Hash (options):

  • :max_retries (Integer)

    Maximum number of retries (default: from config)

  • :retry_delay (Integer)

    Base retry delay in seconds (default: from config)

  • :timeout (Integer)

    Request timeout in seconds (default: from config)

Returns:

  • (HTTP::Response)

    The HTTP response

Raises:



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/omniauth_openid_federation/http_client.rb', line 15

def self.get(uri, options = {})
  max_retries = options[:max_retries] || Configuration.config.max_retries
  retry_delay = options[:retry_delay] || Configuration.config.retry_delay
  timeout = options[:timeout] || Configuration.config.http_timeout

  http_client = build_http_client(timeout)

  retries = 0
  begin
    http_client.get(uri)
  rescue HTTP::Error, Timeout::Error, Errno::ECONNREFUSED, Errno::ETIMEDOUT => e
    retries += 1
    if retries > max_retries
      error_msg = "Failed to fetch #{uri} after #{max_retries} retries: #{e.class} - #{e.message}"
      OmniauthOpenidFederation::Logger.error("[HttpClient] #{error_msg}")
      raise OmniauthOpenidFederation::NetworkError, error_msg, e.backtrace
    end

    delay = [retry_delay * retries, Constants::MAX_RETRY_DELAY_SECONDS].min
    OmniauthOpenidFederation::Logger.warn("[HttpClient] Request failed (attempt #{retries}/#{max_retries}), retrying in #{delay}s: #{e.message}")
    sleep(delay)
    retry
  end
end