Class: Yookassa::Middleware::Retry

Inherits:
Faraday::Middleware
  • Object
show all
Defined in:
lib/yookassa/middleware/retry.rb

Overview

Faraday middleware that retries requests on transient failures.

Retries on HTTP 202 (object not ready yet), 500 (server error), and Faraday connection/timeout exceptions. Uses linear backoff with configurable delay.

Constant Summary collapse

RETRYABLE_STATUSES =

HTTP status codes that trigger a retry.

[202, 500].freeze

Instance Method Summary collapse

Constructor Details

#initialize(app, max_retries: 3, retry_delay: 1.8) ⇒ Retry

Returns a new instance of Retry.

Parameters:

  • app (#call)

    the next middleware in the Faraday stack

  • max_retries (Integer) (defaults to: 3)

    maximum number of retry attempts (default: 3)

  • retry_delay (Float) (defaults to: 1.8)

    base delay in seconds, multiplied by attempt number (default: 1.8)



17
18
19
20
21
# File 'lib/yookassa/middleware/retry.rb', line 17

def initialize(app, max_retries: 3, retry_delay: 1.8)
  super(app)
  @max_retries = max_retries
  @retry_delay = retry_delay
end

Instance Method Details

#call(env) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/yookassa/middleware/retry.rb', line 23

def call(env)
  attempt = 0

  loop do
    response = @app.call(env)
    return response unless retryable_status?(response, attempt)

    attempt = prepare_retry(attempt, env)
  rescue Faraday::ConnectionFailed, Faraday::TimeoutError => e
    raise e if attempt >= @max_retries

    attempt = prepare_retry(attempt, env)
  end
end