diff options
| author | mokha <mokha@cisco.com> | 2018-11-10 10:09:33 -0700 |
|---|---|---|
| committer | mokha <mokha@cisco.com> | 2018-11-10 10:09:33 -0700 |
| commit | bd4e24325b76740c91a96080a3cee9d732c960db (patch) | |
| tree | 9077558201b5460fbe92b84ab3fffa1e6f53921f | |
| parent | a247acd75e953221cee80262eba278916bb73f8c (diff) | |
add retry.
| -rw-r--r-- | lib/net/hippie.rb | 8 | ||||
| -rw-r--r-- | lib/net/hippie/client.rb | 14 | ||||
| -rw-r--r-- | test/net/client_test.rb | 14 |
3 files changed, 35 insertions, 1 deletions
diff --git a/lib/net/hippie.rb b/lib/net/hippie.rb index 71e786d..6c39a50 100644 --- a/lib/net/hippie.rb +++ b/lib/net/hippie.rb @@ -14,6 +14,14 @@ require 'net/hippie/api' module Net # net/http for hippies. module Hippie + CONNECTION_ERRORS = [ + EOFError, + Errno::ECONNRESET, + Errno::EINVAL, + Net::ProtocolError, + Timeout::Error + ].freeze + def self.logger @logger ||= Logger.new(STDOUT) end diff --git a/lib/net/hippie/client.rb b/lib/net/hippie/client.rb index 2760d74..9797697 100644 --- a/lib/net/hippie/client.rb +++ b/lib/net/hippie/client.rb @@ -12,6 +12,7 @@ module Net attr_accessor :mapper attr_accessor :read_timeout + attr_accessor :logger def initialize( certificate: nil, @@ -27,6 +28,7 @@ module Net @passphrase = passphrase @read_timeout = 30 @verify_mode = verify_mode + @logger = Net::Hippie.logger end def execute(uri, request) @@ -60,6 +62,16 @@ module Net execute(uri, request, &block) end + def with_retry(retries: 3) + retries.downto(0) do |n| + return yield self + rescue *::Net::Hippie::CONNECTION_ERRORS => error + logger.error("Retry Attempt: #{n}") + logger.error(error) + raise error if n.zero? + end + end + private attr_reader :default_headers @@ -71,7 +83,7 @@ module Net http.read_timeout = read_timeout http.use_ssl = uri.scheme == 'https' http.verify_mode = verify_mode - http.set_debug_output(Net::Hippie.logger) + http.set_debug_output(logger) apply_client_tls_to(http) http end diff --git a/test/net/client_test.rb b/test/net/client_test.rb index caec258..2037cfd 100644 --- a/test/net/client_test.rb +++ b/test/net/client_test.rb @@ -6,6 +6,7 @@ class ClientTest < Minitest::Test def initialize(*args) super @subject = Net::Hippie::Client.new + @subject.logger = Logger.new('/dev/null') end def test_get @@ -17,6 +18,19 @@ class ClientTest < Minitest::Test end end + def test_get_with_retry + uri = URI.parse('https://www.example.org/api/scim/v2/schemas') + WebMock.stub_request(:get, uri.to_s) + .to_timeout.then + .to_timeout.then + .to_return(status: 200, body: { 'success' => 'true' }.to_json) + response = subject.with_retry(retries: 3) do |client| + client.get(uri) + end + refute_nil response + assert_equal('true', JSON.parse(response.body)['success']) + end + def test_get_with_string_uri VCR.use_cassette('get_breaches') do response = subject.get('https://haveibeenpwned.com/api/breaches') |
