Skip to content

Commit 6dda933

Browse files
Merge pull request #387 from intercom/ak/handle-retries
handle negative sleep time for rate limit retries
2 parents 2ee9189 + dd1ea57 commit 6dda933

2 files changed

Lines changed: 14 additions & 2 deletions

File tree

lib/intercom/request.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,8 @@ def execute(target_base_url=nil, username:, secret: nil)
7474
parsed_body
7575
rescue Intercom::RateLimitExceeded => e
7676
if @handle_rate_limit
77-
sleep (@rate_limit_details[:reset_at] - Time.now.utc).ceil
77+
seconds_to_retry = (@rate_limit_details[:reset_at] - Time.now.utc).ceil
78+
sleep seconds_to_retry unless seconds_to_retry < 0
7879
retry unless (retries -=1).zero?
7980
else
8081
raise e
@@ -109,7 +110,7 @@ def set_rate_limit_details(response)
109110
rate_limit_details = {}
110111
rate_limit_details[:limit] = response['X-RateLimit-Limit'].to_i if response['X-RateLimit-Limit']
111112
rate_limit_details[:remaining] = response['X-RateLimit-Remaining'].to_i if response['X-RateLimit-Remaining']
112-
rate_limit_details[:reset_at] = Time.at(response['X-RateLimit-Reset'].to_i) if response['X-RateLimit-Reset']
113+
rate_limit_details[:reset_at] = Time.parse(response['X-RateLimit-Reset']) if response['X-RateLimit-Reset']
113114
@rate_limit_details = rate_limit_details
114115
end
115116

spec/unit/intercom/request_spec.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,17 @@
6161
req.execute(target_base_url=uri, username: "ted", secret: "")
6262
end
6363

64+
it 'should not sleep if rate limit reset time has passed' do
65+
# Use webmock to mock the HTTP request
66+
stub_request(:any, uri).\
67+
to_return(status: [429, "Too Many Requests"], headers: { 'X-RateLimit-Reset' => Time.parse("February 25 2010").utc }).\
68+
then.to_return(status: [200, "OK"])
69+
req = Intercom::Request.get(uri, "")
70+
req.handle_rate_limit=true
71+
req.expects(:sleep).never.with(any_parameters)
72+
req.execute(target_base_url=uri, username: "ted", secret: "")
73+
end
74+
6475
end
6576

6677

0 commit comments

Comments
 (0)