Sha256: bda9f225a89074a51ffdc8d6a1844e359ff595208089083c62c0dc2742ef242d

Contents?: true

Size: 1005 Bytes

Versions: 6

Compression:

Stored size: 1005 Bytes

Contents

module Scrivito
class CmsRestApi
module RateLimit
  class << self
    def retry_on_rate_limit(request_timer, &block)
      internal_retry(block, request_timer, 0)
    end

    private

    def internal_retry(request_proc, request_timer, retry_count)
      response = request_proc.call

      if failed_because_of_rate_limit?(response)
        time_to_sleep = calculate_time_to_sleep(response['Retry-After'].to_f, retry_count)

        if request_timer.cover?(Time.now + time_to_sleep.seconds)
          sleep time_to_sleep
          internal_retry(request_proc, request_timer, retry_count + 1)
        else
          raise Scrivito::RateLimitExceeded.new('rate limit exceeded', 429)
        end
      else
        response
      end
    end


    def calculate_time_to_sleep(retry_after, retry_count)
      backoff_wait_time = 2 ** retry_count * 0.5
      [backoff_wait_time, retry_after].max
    end

    def failed_because_of_rate_limit?(response)
      response.code == '429'
    end
  end
end
end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
scrivito_sdk-0.70.2 lib/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-0.70.1 lib/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-0.70.0 lib/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-0.70.0.rc3 lib/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-0.70.0.rc2 lib/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-0.70.0.rc1 lib/scrivito/cms_rest_api/rate_limit.rb