main
 1# frozen_string_literal: true
 2
 3require 'base64'
 4require 'json'
 5require 'logger'
 6require 'net/http'
 7require 'openssl'
 8
 9require 'net/hippie/version'
10require 'net/hippie/client'
11require 'net/hippie/connection'
12require 'net/hippie/content_type_mapper'
13
14module Net
15  # net/http for hippies.
16  module Hippie
17    CONNECTION_ERRORS = [
18      EOFError,
19      Errno::ECONNREFUSED,
20      Errno::ECONNRESET,
21      Errno::ECONNRESET,
22      Errno::EHOSTUNREACH,
23      Errno::EINVAL,
24      Net::OpenTimeout,
25      Net::ProtocolError,
26      Net::ReadTimeout,
27      OpenSSL::OpenSSLError,
28      OpenSSL::SSL::SSLError,
29      SocketError,
30      Timeout::Error
31    ].freeze
32
33    def self.logger
34      @logger ||= Logger.new(nil)
35    end
36
37    def self.logger=(logger)
38      @logger = logger
39    end
40
41    def self.verify_mode
42      @verify_mode ||= OpenSSL::SSL::VERIFY_PEER
43    end
44
45    def self.verify_mode=(mode)
46      @verify_mode = mode
47    end
48
49    def self.basic_auth(username, password)
50      "Basic #{::Base64.strict_encode64("#{username}:#{password}")}"
51    end
52
53    def self.bearer_auth(token)
54      "Bearer #{token}"
55    end
56
57    def self.method_missing(symbol, *args)
58      default_client.with_retry(retries: 3) do |client|
59        client.public_send(symbol, *args)
60      end || super
61    end
62
63    def self.respond_to_missing?(name, _include_private = false)
64      Client.public_instance_methods.include?(name.to_sym) || super
65    end
66
67    def self.default_client
68      @default_client ||= Client.new(follow_redirects: 3, logger: logger)
69    end
70  end
71end