Class: Dinie::Internal::RateLimitTracker

Inherits:
Object
  • Object
show all
Defined in:
lib/dinie/runtime/rate_limit.rb,
sig/dinie/runtime/rate_limit.rbs

Overview

Parses the three X-RateLimit-* headers and holds the most recent snapshot for HttpClient.

Constant Summary collapse

LIMIT_HEADER =

Response header carrying the window ceiling.

Returns:

  • (String)
"x-ratelimit-limit"
REMAINING_HEADER =

Response header carrying the requests remaining in the window.

Returns:

  • (String)
"x-ratelimit-remaining"
RESET_HEADER =

Response header carrying the window reset time (epoch seconds or delta seconds).

Returns:

  • (String)
"x-ratelimit-reset"
EPOCH_THRESHOLD_SECONDS =

X-RateLimit-Reset values at or above this (seconds) are read as an absolute Unix epoch; anything below as a delta in seconds from now. 1e9 seconds is ~2001-09 — far above any plausible "seconds until reset" window yet below every real epoch.

Returns:

  • (Integer)
1_000_000_000

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.parse(headers) ⇒ Dinie::RateLimit?

Parse the three headers into a RateLimit, or nil when any is absent/unparseable.

Parameters:

  • headers (Object)

Returns:



103
104
105
106
107
108
109
110
# File 'lib/dinie/runtime/rate_limit.rb', line 103

def self.parse(headers)
  limit = parse_count(header_value(headers, LIMIT_HEADER))
  remaining = parse_count(header_value(headers, REMAINING_HEADER))
  reset_at = parse_reset(header_value(headers, RESET_HEADER))
  return nil if limit.nil? || remaining.nil? || reset_at.nil?

  Dinie::RateLimit.new(limit: limit, remaining: remaining, reset_at: reset_at)
end

Instance Method Details

#snapshot ⇒ Dinie::RateLimit?

Latest snapshot, or nil before any valid headers.

Returns:



84
85
86
# File 'lib/dinie/runtime/rate_limit.rb', line 84

def snapshot
  @current
end

#update(headers) ⇒ void

This method returns an undefined value.

Fold a response's headers into the snapshot (a header-less/garbage response is a no-op).

Parameters:

  • headers (Object)


93
94
95
96
# File 'lib/dinie/runtime/rate_limit.rb', line 93

def update(headers)
  parsed = self.class.parse(headers)
  @current = parsed unless parsed.nil?
end