Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions lib/readwise/client.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,15 @@
module Readwise
class Client
class Error < StandardError; end
class TooManyRequests < Error
def initialize(retry_after)
@retry_after = retry_after
end

def message
"Try again after #{@retry_after} seconds"
end
end

BASE_URL = "https://readwise.io/api/v2/"
V3_BASE_URL = "https://readwise.io/api/v3/"
Expand Down Expand Up @@ -302,6 +311,11 @@ def get_readwise_request(url)
http.request(req)
end

if res.code == "429" # Too Many Requests
retry_after = Integer(res.fetch("Retry-After"))
raise TooManyRequests.new(retry_after)
end

raise Error, "Get request failed with status code: #{res.code}" unless res.is_a?(Net::HTTPSuccess)

JSON.parse(res.body)
Expand Down
11 changes: 11 additions & 0 deletions spec/readwise/client_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,17 @@
.to raise_error(Readwise::Client::Error, 'Get request failed with status code: 404')
end

it 'raises TooManyRequests error on a 429 response' do
response = double(code: '429', is_a?: false)
allow(response).to receive(:fetch).with("Retry-After").and_return('120')
allow(Net::HTTP).to receive(:start).and_return(response)

expect { subject.send(:get_readwise_request, 'https://example.com') }
.to raise_error(Readwise::Client::TooManyRequests) do |error|
expect(error.message).to eq('Try again after 120 seconds')
end
end

it 'raises error on failed POST request' do
allow(Net::HTTP).to receive(:start).and_return(double(is_a?: false))

Expand Down