Module: HTTPX::Plugins::RateLimiter

Defined in:
lib/httpx/plugins/rate_limiter.rb

Overview

This plugin adds support for retrying requests when the request:

  • is rate limited;

  • when the server is unavailable (503);

  • when a 3xx request comes with a “retry-after” value

gitlab.com/os85/httpx/wikis/Rate-Limiter

Constant Summary collapse

RATE_LIMIT_CODES =
[429, 503].freeze

Class Method Summary collapse

Class Method Details

.configure(klass) ⇒ Object



18
19
20
21
22
23
# File 'lib/httpx/plugins/rate_limiter.rb', line 18

def configure(klass)
  klass.plugin(:retries,
               retry_change_requests: true,
               retry_on: method(:retry_on_rate_limited_response),
               retry_after: method(:retry_after_rate_limit))
end

.retry_after_rate_limit(_, response) ⇒ Object

Servers send the “Retry-After” header field to indicate how long the user agent ought to wait before making a follow-up request. When sent with a 503 (Service Unavailable) response, Retry-After indicates how long the service is expected to be unavailable to the client. When sent with any 3xx (Redirection) response, Retry-After indicates the minimum time that the user agent is asked to wait before issuing the redirected request.



41
42
43
44
45
46
47
48
49
# File 'lib/httpx/plugins/rate_limiter.rb', line 41

def retry_after_rate_limit(_, response)
  return unless response.is_a?(Response)

  retry_after = response.headers["retry-after"]

  return unless retry_after

  Utils.parse_retry_after(retry_after)
end

.retry_on_rate_limited_response(response) ⇒ Object



25
26
27
28
29
30
31
# File 'lib/httpx/plugins/rate_limiter.rb', line 25

def retry_on_rate_limited_response(response)
  return false unless response.is_a?(Response)

  status = response.status

  RATE_LIMIT_CODES.include?(status)
end