diff options
Diffstat (limited to 'lib/net/hippie.rb')
| -rw-r--r-- | lib/net/hippie.rb | 76 |
1 files changed, 45 insertions, 31 deletions
diff --git a/lib/net/hippie.rb b/lib/net/hippie.rb index 5a9966e..a1cd91d 100644 --- a/lib/net/hippie.rb +++ b/lib/net/hippie.rb @@ -3,69 +3,83 @@ require 'base64' require 'json' require 'logger' +require 'monitor' require 'net/http' require 'openssl' +require 'resolv' +require 'timeout' -require 'net/hippie/version' require 'net/hippie/client' require 'net/hippie/connection' +require 'net/hippie/connection_pool' require 'net/hippie/content_type_mapper' +require 'net/hippie/version' module Net - # net/http for hippies. + # High-performance HTTP client with connection pooling and DNS caching. module Hippie CONNECTION_ERRORS = [ EOFError, Errno::ECONNREFUSED, Errno::ECONNRESET, - Errno::ECONNRESET, Errno::EHOSTUNREACH, Errno::EINVAL, + Errno::EPIPE, + Errno::ECONNABORTED, + Errno::ETIMEDOUT, + IOError, Net::OpenTimeout, Net::ProtocolError, Net::ReadTimeout, + Net::WriteTimeout, OpenSSL::OpenSSLError, OpenSSL::SSL::SSLError, SocketError, Timeout::Error ].freeze - def self.logger - @logger ||= Logger.new(nil) - end + BASIC_PREFIX = 'Basic ' + BEARER_PREFIX = 'Bearer ' - def self.logger=(logger) - @logger = logger - end + class << self + attr_writer :logger, :verify_mode - def self.verify_mode - @verify_mode ||= OpenSSL::SSL::VERIFY_PEER - end + def logger + @logger ||= Logger.new(nil) + end - def self.verify_mode=(mode) - @verify_mode = mode - end + def verify_mode + @verify_mode ||= OpenSSL::SSL::VERIFY_PEER + end - def self.basic_auth(username, password) - "Basic #{::Base64.strict_encode64("#{username}:#{password}")}" - end + def basic_auth(username, password) + BASIC_PREFIX + ::Base64.strict_encode64("#{username}:#{password}") + end - def self.bearer_auth(token) - "Bearer #{token}" - end + def bearer_auth(token) + BEARER_PREFIX + token + end - def self.method_missing(symbol, *args) - default_client.with_retry(retries: 3) do |client| - client.public_send(symbol, *args) - end || super - end + def default_client + @default_client ||= Client.new(follow_redirects: 3, logger: logger) + end - def self.respond_to_missing?(name, _include_private = false) - Client.public_instance_methods.include?(name.to_sym) || super - end + def reset_default_client! + @default_client = nil + end + + %i[get post put patch delete head options].each do |method| + define_method(method) do |*args, **kwargs, &block| + default_client.with_retry(retries: 3) { |c| c.public_send(method, *args, **kwargs, &block) } + end + end - def self.default_client - @default_client ||= Client.new(follow_redirects: 3, logger: logger) + def resolve(hostname, timeout: 5) + Timeout.timeout(timeout) do + addresses = Resolv.getaddresses(hostname) + addresses.find { |a| a.match?(/^\d+\.\d+\.\d+\.\d+$/) } || addresses.first + end + end end end end |
