Skip to content

Commit 499e5f5

Browse files
committed
Handle 429 (Too Many Requests)
1 parent 73f31f7 commit 499e5f5

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

lib/readwise/client.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,15 @@
99
module Readwise
1010
class Client
1111
class Error < StandardError; end
12+
class TooManyRequests < Error
13+
def initialize(retry_after)
14+
@retry_after = retry_after
15+
end
16+
17+
def message
18+
"Try again after #{@retry_after} seconds"
19+
end
20+
end
1221

1322
BASE_URL = "https://readwise.io/api/v2/"
1423
V3_BASE_URL = "https://readwise.io/api/v3/"
@@ -302,6 +311,11 @@ def get_readwise_request(url)
302311
http.request(req)
303312
end
304313

314+
if res.code == "429" # Too Many Requests
315+
retry_after = Integer(res.fetch("Retry-After"))
316+
raise TooManyRequests.new(retry_after)
317+
end
318+
305319
raise Error, "Get request failed with status code: #{res.code}" unless res.is_a?(Net::HTTPSuccess)
306320

307321
JSON.parse(res.body)

spec/readwise/client_spec.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,17 @@
311311
.to raise_error(Readwise::Client::Error, 'Get request failed with status code: 404')
312312
end
313313

314+
it 'raises TooManyRequests error on a 429 response' do
315+
response = double(code: '429', is_a?: false)
316+
allow(response).to receive(:fetch).with("Retry-After").and_return('120')
317+
allow(Net::HTTP).to receive(:start).and_return(response)
318+
319+
expect { subject.send(:get_readwise_request, 'https://example.com') }
320+
.to raise_error(Readwise::Client::TooManyRequests) do |error|
321+
expect(error.message).to eq('Try again after 120 seconds')
322+
end
323+
end
324+
314325
it 'raises error on failed POST request' do
315326
allow(Net::HTTP).to receive(:start).and_return(double(is_a?: false))
316327

0 commit comments

Comments
 (0)