Coverage for jutil/request.py: 48%

# Coverage for jutil/request.py : 48%

## 34 statements 19 run 15 missing 0 excluded 2 partial

Hot-keys on this page

r m x p toggle line displays

j k next/prev highlighted chunk

0 (zero) top of page

1 (one) first highlighted chunk

1 import logging

2 from typing import Tuple

3 from django.conf import settings

4 import requests

5 import socket

6

7

8 logger = logging.getLogger(__name__)

9

10

11 def get_geo_ip(ip: str, exceptions: bool = False, timeout: int = 10) -> dict:

12 """

13 Returns geo IP info or empty dict if geoip query fails at http://ipstack.com.

14 requires settings.IPSTACK_TOKEN set as valid access token to the API.

15

16 Example replies:

17

18 {'country_name': 'United States', 'country_code': 'US', 'region_code': 'TX', 'region_name': 'Texas',

19 'ip': '76.184.236.184', 'latitude': 33.1507, 'time_zone': 'America/Chicago', 'metro_code': 623, 'city':

20 'Frisco', 'longitude': -96.8236, 'zip_code': '75033'}

21

22 {'latitude': 60.1641, 'country_name': 'Finland', 'zip_code': '02920', 'region_name': 'Uusimaa', 'city':

23 'Espoo', 'metro_code': 0, 'ip': '194.100.27.41', 'time_zone': 'Europe/Helsinki', 'country_code': 'FI',

24 'longitude': 24.7136, 'region_code': '18'}

25

26 :param ip: str

27 :param exceptions: if True raises Exception on failure

28 :param timeout: timeout in seconds

29 :return: dict

30 """

31 try:

32 res = requests.get('http://api.ipstack.com/{}?access_key={}&format=1'.format(ip, settings.IPSTACK_TOKEN), timeout=timeout)

33 if res.status_code != 200: 33 ↛ 34line 33 didn't jump to line 34, because the condition on line 33 was never true

34 if exceptions:

35 raise Exception('api.ipstack.com HTTP {}'.format(res.status_code))

36 return {}

37 return res.json()

38 except Exception as e:

39 msg = 'geoip({}) failed: {}'.format(ip, e)

40 logger.error(msg)

41 if exceptions:

42 raise

43 return {}

44

45

46 def get_ip_info(ip: str, exceptions: bool = False, timeout: int = 10) -> Tuple[str, str, str]:

47 """

48 Returns (ip, country_code, host) tuple of the IP address.

49 :param ip: IP address

50 :param exceptions: Raise Exception or not

51 :param timeout: Timeout in seconds. Note that timeout only affects geo IP part, not getting host name.

52 :return: (ip, country_code, host)

53 """

54 if not ip: # localhost 54 ↛ 55line 54 didn't jump to line 55, because the condition on line 54 was never true

55 return '', '', ''

56 host = ''

57 country_code = get_geo_ip(ip, exceptions=exceptions, timeout=timeout).get('country_code', '')

58 try:

59 res = socket.gethostbyaddr(ip)

60 host = res[0][:255] if ip else ''

61 except Exception as e:

62 msg = 'socket.gethostbyaddr({}) failed: {}'.format(ip, e)

63 logger.error(msg)

64 if exceptions:

65 raise e

66 return ip, country_code, host