diff --git a/lib/readwise/client.rb b/lib/readwise/client.rb index 268d4f3..05b833e 100644 --- a/lib/readwise/client.rb +++ b/lib/readwise/client.rb @@ -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/" @@ -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) diff --git a/spec/readwise/client_spec.rb b/spec/readwise/client_spec.rb index def52b6..dfd56c8 100644 --- a/spec/readwise/client_spec.rb +++ b/spec/readwise/client_spec.rb @@ -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))