Sha256: a586b780f28f9bd788a70746b9ecd8cdb13bcf6010d896f4d56cce51a4bd871b

Contents?: true

Size: 1.07 KB

Versions: 71

Compression:

Stored size: 1.07 KB

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)
          Warning.warn("Rate limit exceeded. Will retry after #{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

71 entries across 71 versions & 1 rubygems

Version Path
scrivito_sdk-1.4.0.rc2 lib/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.4.0.rc1 lib/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.3.1 lib/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.3.1.rc1 lib/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.3.0 lib/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.3.0.rc3 lib/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.3.0.rc2 lib/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.3.0.rc1 lib/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.2.0 lib/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.2.0.rc3 lib/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.2.0.rc2 lib/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.2.0.rc1 lib/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.1.1 lib/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.1.0 lib/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.1.0.rc3 lib/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.1.0.rc2 lib/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.1.0.rc1 lib/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.0.0 lib/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.0.0.rc4 lib/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.0.0.rc3 lib/scrivito/cms_rest_api/rate_limit.rb