diff options
| -rw-r--r-- | lib/net/hippie.rb | 5 | ||||
| -rw-r--r-- | lib/net/hippie/client.rb | 22 |
2 files changed, 19 insertions, 8 deletions
diff --git a/lib/net/hippie.rb b/lib/net/hippie.rb index 71e786d..9a7ea72 100644 --- a/lib/net/hippie.rb +++ b/lib/net/hippie.rb @@ -14,6 +14,11 @@ require 'net/hippie/api' module Net # net/http for hippies. module Hippie + TIMEOUT_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 e28633d..a140653 100644 --- a/lib/net/hippie/client.rb +++ b/lib/net/hippie/client.rb @@ -72,15 +72,11 @@ module Net # attempt 8 -> delay 12.8 second def with_retry(retries: 3) retries = 0 if retries.nil? || retries.negative? + 0.upto(retries) do |n| - return yield self - rescue EOFError, Errno::ECONNRESET, Errno::EINVAL, - Net::ProtocolError, Timeout::Error => error - raise error if n == retries - - delay = ((2**n) * 0.1) + Random.rand(0.05) # delay + jitter - warn("`#{error.message}` Retry: #{n + 1}/#{retries} Delay: #{delay}s") - sleep delay + attempt(n, retries) do + return yield self + end end end @@ -90,6 +86,16 @@ module Net attr_reader :verify_mode attr_reader :certificate, :key, :passphrase + def attempt(attempt, max) + yield + rescue *TIMEOUT_ERRORS => error + raise error if attempt == max + + delay = ((2**attempt) * 0.1) + Random.rand(0.05) # delay + jitter + warn("`#{error.message}` Retry: #{attempt + 1}/#{max} Delay: #{delay}s") + sleep delay + end + def http_for(uri) http = Net::HTTP.new(uri.host, uri.port) http.read_timeout = read_timeout |
