Sha256: 6e2f28e0147f02011c34ed8e60739d40d553eb635d11dee516450031933a96c4

Contents?: true

Size: 1.07 KB

Versions: 21

Compression:

Stored size: 1.07 KB

Contents

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

  private_class_method def self.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

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

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

Version data entries

21 entries across 21 versions & 1 rubygems

Version Path
scrivito_sdk-1.15.0 app/cms/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.15.0.rc2 app/cms/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.15.0.rc1 app/cms/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.14.0 app/cms/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.14.0.rc3 app/cms/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.14.0.rc2 app/cms/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.14.0.rc1 app/cms/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.13.0 app/cms/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.13.0.rc2 app/cms/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.13.0.rc1 app/cms/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.12.0 app/cms/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.12.0.rc2 app/cms/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.12.0.rc1 app/cms/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.11.0 app/cms/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.11.0.rc1 app/cms/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.10.0 app/cms/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.10.0.rc5 app/cms/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.10.0.rc4 app/cms/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.10.0.rc3 app/cms/scrivito/cms_rest_api/rate_limit.rb
scrivito_sdk-1.10.0.rc2 lib/scrivito/cms_rest_api/rate_limit.rb