Class: Nordvpn::Api::Client

Inherits:
Object
  • Object
show all
Includes:
Endpoints::Servers
Defined in:
lib/nordvpn/api/client.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Endpoints::Servers

#country_servers, #ikev2_servers, #l2tp_servers, #openvpn_tcp_servers, #openvpn_udp_servers, #pptp_servers, #proxy_servers, #retrieve_servers, #servers_by_country, #servers_by_features, #servers_by_type_and_country, #socks_servers

Constructor Details

#initialize(proxy: nil, configuration: ::Nordvpn::Api.configuration) ⇒ Client

Returns a new instance of Client.



6
7
8
9
10
# File 'lib/nordvpn/api/client.rb', line 6

def initialize(proxy: nil, configuration: ::Nordvpn::Api.configuration)
  self.proxy            =   proxy
  self.configuration    =   configuration
  self.cache            =   {}
end

Instance Attribute Details

#cacheObject

Returns the value of attribute cache.



4
5
6
# File 'lib/nordvpn/api/client.rb', line 4

def cache
  @cache
end

#configurationObject

Returns the value of attribute configuration.



4
5
6
# File 'lib/nordvpn/api/client.rb', line 4

def configuration
  @configuration
end

#proxyObject

Returns the value of attribute proxy.



4
5
6
# File 'lib/nordvpn/api/client.rb', line 4

def proxy
  @proxy
end

Instance Method Details

#connect(host:, options: {}) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/nordvpn/api/client.rb', line 12

def connect(host:, options: {})
  request_options       =   options.fetch(:request, {})
  
  connection            =   ::Faraday.new(host, request: request_options) do |builder|
    builder.options[:timeout]         =   options.fetch(:timeout, nil)      if options.fetch(:timeout, nil)
    builder.options[:open_timeout]    =   options.fetch(:open_timeout, nil) if options.fetch(:open_timeout, nil)
  
    builder.request  :json
    
    builder.response :logger, ::Logger.new(STDOUT), bodies: true if self.configuration.verbose
    builder.response :json, content_type: /\bjson$/
    
    builder.use ::FaradayMiddleware::FollowRedirects, limit: 10
    
    if self.proxy
      builder.proxy     =   generate_proxy(self.proxy)
      puts "[NordVpn::Api::Client] - Will connect to NordVPN's API using proxy: #{self.proxy.inspect}" if self.configuration.verbose
    end

    builder.adapter self.configuration.faraday.fetch(:adapter, ::Faraday.default_adapter)
  end
end

#delete(path, parameters: {}, data: {}, headers: {}, options: {}) ⇒ Object



55
56
57
# File 'lib/nordvpn/api/client.rb', line 55

def delete(path, parameters: {}, data: {}, headers: {}, options: {})
  request path, method: :delete, parameters: parameters, data: data, headers: headers, options: options
end

#generate_proxy(host:, port:, username:, password:) ⇒ Object



87
88
89
90
91
92
93
# File 'lib/nordvpn/api/client.rb', line 87

def generate_proxy(host:, port:, username:, password:)
  {
    uri:      "http://#{host}:#{port}",
    user:     username,
    password: password
  }
end

#get(path, parameters: {}, headers: {}, options: {}) ⇒ Object



35
36
37
# File 'lib/nordvpn/api/client.rb', line 35

def get(path, parameters: {}, headers: {}, options: {})
  request path, method: :get, parameters: parameters, headers: headers, options: options
end

#head(path, parameters: {}, headers: {}, options: {}) ⇒ Object



39
40
41
# File 'lib/nordvpn/api/client.rb', line 39

def head(path, parameters: {}, headers: {}, options: {})
  request path, method: :head, parameters: parameters, headers: headers, options: options
end

#patch(path, parameters: {}, data: {}, headers: {}, options: {}) ⇒ Object



51
52
53
# File 'lib/nordvpn/api/client.rb', line 51

def patch(path, parameters: {}, data: {}, headers: {}, options: {})
  request path, method: :patch, parameters: parameters, data: data, headers: headers, options: options
end

#post(path, parameters: {}, data: {}, headers: {}, options: {}) ⇒ Object



43
44
45
# File 'lib/nordvpn/api/client.rb', line 43

def post(path, parameters: {}, data: {}, headers: {}, options: {})
  request path, method: :post, parameters: parameters, data: data, headers: headers, options: options
end

#put(path, parameters: {}, data: {}, headers: {}, options: {}) ⇒ Object



47
48
49
# File 'lib/nordvpn/api/client.rb', line 47

def put(path, parameters: {}, data: {}, headers: {}, options: {})
  request path, method: :put, parameters: parameters, data: data, headers: headers, options: options
end

#request(path, method: :get, parameters: {}, data: {}, headers: {}, options: {}) ⇒ Object



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
# File 'lib/nordvpn/api/client.rb', line 59

def request(path, method: :get, parameters: {}, data: {}, headers: {}, options: {})
  connection                =   connect(host: self.configuration.host, options: options)
  
  headers["User-Agent"]     =   headers.fetch("User-Agent", ::Agents.random_user_agent(:desktop))
  
  response                  =   case method
    when :get
      connection.get do |request|
        request.url path unless path.to_s.empty?
        request.headers     =   connection.headers.merge(headers)
        request.params      =   parameters if parameters && !parameters.empty?
      end
    when :head
      connection.head do |request|
        request.url path unless path.to_s.empty?
        request.headers     =   connection.headers.merge(headers)
        request.params      =   parameters if parameters && !parameters.empty?
      end
    when :post, :put, :patch, :delete
      connection.send(method) do |request|
        request.url path unless path.to_s.empty?
        request.headers     =   connection.headers.merge(headers)
        request.body        =   data if data && !data.empty?
        request.params      =   parameters if parameters && !parameters.empty?
      end
  end
end