Class: WifiWand::PublicIpLookup

Inherits:
Object
  • Object
show all
Defined in:
lib/wifi_wand/services/public_ip_lookup.rb

Constant Summary collapse

PUBLIC_IP_TIMEOUT_IN_SECONDS =
3
PUBLIC_IP_MAX_ATTEMPTS =
3
PUBLIC_IP_RETRY_BASE_DELAY_IN_SECONDS =
0.2
COUNTRY_CODE_REGEX =
/\A[A-Z]{2}\z/

Instance Method Summary collapse

Instance Method Details

#addressObject



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/wifi_wand/services/public_ip_lookup.rb', line 47

def address
  uri = URI.parse('https://api.ipify.org')
  response = public_ip_http_get(uri)
  address = response.body.to_s.strip

  if valid_public_ip_address?(address)
    address
  else
    raise(PublicIPLookupError.new(
      status_code:    nil,
      status_message: nil,
      message:        'Public IP lookup failed: malformed response',
      url:            uri.to_s,
      body:           response.body
    ))
  end
end

#countryObject



65
# File 'lib/wifi_wand/services/public_ip_lookup.rb', line 65

def country = info.fetch('country')

#infoObject



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
# File 'lib/wifi_wand/services/public_ip_lookup.rb', line 18

def info
  uri = URI.parse('https://api.country.is/')
  response = public_ip_http_get(uri)
  parsed = JSON.parse(response.body)

  address = parsed['ip'].to_s.strip
  country = parsed['country'].to_s.strip.upcase

  unless valid_public_ip_address?(address) && country.match?(COUNTRY_CODE_REGEX)
    raise(PublicIPLookupError.new(
      status_code:    nil,
      status_message: nil,
      message:        'Public IP lookup failed: malformed response',
      url:            uri.to_s,
      body:           response.body
    ))
  end

  { 'address' => address, 'country' => country }
rescue JSON::ParserError
  raise(PublicIPLookupError.new(
    status_code:    nil,
    status_message: nil,
    message:        'Public IP lookup failed: malformed response',
    url:            uri.to_s,
    body:           response&.body
  ))
end