class Zendesk2::RateLimit

Faraday middleware to block and sleep on rate limit events

Attributes

logger[R]

Public Class Methods

new(app, options = {}) click to toggle source
# File lib/zendesk2/rate_limit.rb, line 8
def initialize(app, options = {})
  @app    = app
  @logger = options[:logger] || ::Logger.new(nil)
end

Public Instance Methods

call(env) click to toggle source
# File lib/zendesk2/rate_limit.rb, line 13
def call(env)
  original_env = env.dup
  response = @app.call(env)

  if response.env[:status] == 429
    delay = (response.env[:response_headers][:retry_after]).to_f
    logger.warn "Rate limited! Retrying after #{delay} seconds."

    sleep(delay)

    call(original_env).tap { |r| increment(r, delay) }
  else
    response
  end
end

Private Instance Methods

increment(response, delay) click to toggle source
# File lib/zendesk2/rate_limit.rb, line 31
def increment(response, delay)
  existing_delay = response.headers[:rate_limits] || 0.0
  response.headers[:rate_limits] = existing_delay.to_f + delay.to_f
end