summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormokha <mokha@cisco.com>2018-11-10 10:09:33 -0700
committermokha <mokha@cisco.com>2018-11-10 10:09:33 -0700
commitbd4e24325b76740c91a96080a3cee9d732c960db (patch)
tree9077558201b5460fbe92b84ab3fffa1e6f53921f
parenta247acd75e953221cee80262eba278916bb73f8c (diff)
add retry.
-rw-r--r--lib/net/hippie.rb8
-rw-r--r--lib/net/hippie/client.rb14
-rw-r--r--test/net/client_test.rb14
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')