summaryrefslogtreecommitdiff
path: root/lib/net/hippie/client.rb
blob: 0433c0279e1b4c3319566db55a034f56b4c8647b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
module Net
  module Hippie
    class Client
      DEFAULT_HEADERS = {
        'Accept' => 'application/json',
        'Content-Type' => 'application/json',
        'User-Agent' => "net/hippie #{Net::Hippie::VERSION}",
      }

      def initialize(
        headers: {},
        certificate: nil,
        key: nil,
        passphrase: nil,
        mapper: JsonMapper.new
      )
        @certificate = certificate
        @default_headers = DEFAULT_HEADERS.merge(headers)
        @key = key
        @mapper = mapper
      end

      def execute(uri, request)
        http_for(uri).request(request)
      end

      def get(uri, headers: {}, body: {})
        request = request_for(Net::HTTP::Get, uri, headers: headers, body: body)
        response = execute(uri, request)
        if block_given?
          yield request, response
        else
          response
        end
      end

      def post(uri, headers: {}, body: {})
        request = request_for(Net::HTTP::Post, uri, headers: headers, body: body)
        response = execute(uri, request)
        if block_given?
          yield request, response
        else
          response
        end
      end

      def put(uri, headers: {}, body: {})
        request = request_for(Net::HTTP::Put, uri, headers: headers, body: body)
        response = execute(uri, request)
        if block_given?
          yield request, response
        else
          response
        end
      end

      private

      attr_reader :default_headers
      attr_reader :certificate, :key, :passphrase
      attr_reader :mapper

      def http_for(uri)
        http = Net::HTTP.new(uri.host, uri.port)
        http.read_timeout = 30
        http.use_ssl = uri.is_a?(URI::HTTPS)
        http.set_debug_output(Net::Hippie.logger)
        http.cert = OpenSSL::X509::Certificate.new(certificate) if certificate
        if key
          if passphrase
            http.key = OpenSSL::PKey::RSA.new(key, passphrase)
          else
            http.key = OpenSSL::PKey::RSA.new(key)
          end
        end
        http
      end

      def request_for(type, uri, headers: {}, body: {})
        type.new(uri, default_headers.merge(headers)).tap do |x|
          x.body = mapper.map_from(body) unless body.empty?
        end
      end
    end
  end
end