http_client.py (3280B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\datadog\api\http_client.py 2 import logging 3 import urllib 4 try: 5 import requests 6 except ImportError: 7 requests = None 8 9 try: 10 from google.appengine.api import urlfetch, urlfetch_errors 11 except ImportError: 12 urlfetch, urlfetch_errors = (None, None) 13 14 from datadog.api.exceptions import ClientError, HTTPError, HttpTimeout 15 log = logging.getLogger('datadog.api') 16 17 class HTTPClient(object): 18 19 @classmethod 20 def request(cls, method, url, headers, params, data, timeout, proxies, verify, max_retries): 21 raise NotImplementedError(u'Must be implemented by HTTPClient subclasses.') 22 23 24 class RequestClient(HTTPClient): 25 26 @classmethod 27 def request(cls, method, url, headers, params, data, timeout, proxies, verify, max_retries): 28 s = requests.Session() 29 http_adapter = requests.adapters.HTTPAdapter(max_retries=max_retries) 30 s.mount('https://', http_adapter) 31 try: 32 result = s.request(method, url, headers=headers, params=params, data=data, timeout=timeout, proxies=proxies, verify=verify) 33 result.raise_for_status() 34 except requests.ConnectionError as e: 35 raise ClientError(method, url, e) 36 except requests.exceptions.Timeout: 37 raise HttpTimeout(method, url, timeout) 38 except requests.exceptions.HTTPError as e: 39 if e.response.status_code in (400, 403, 404, 409): 40 pass 41 else: 42 raise HTTPError(e.response.status_code, result.reason) 43 except TypeError as e: 44 raise TypeError(u"Your installed version of `requests` library seems not compatible withDatadog's usage. We recommand upgrading it ('pip install -U requests').If you need help or have any question, please contact support@datadoghq.com") 45 46 return result 47 48 49 class URLFetchClient(HTTPClient): 50 51 @classmethod 52 def request(cls, method, url, headers, params, data, timeout, proxies, verify, max_retries): 53 validate_certificate = True if verify else False 54 url_with_params = '{url}?{params}'.format(url=url, params=urllib.urlencode(params)) 55 try: 56 result = urlfetch.fetch(url=url_with_params, method=method, headers=headers, validate_certificate=validate_certificate, deadline=timeout, payload=data, follow_redirects=False) 57 cls.raise_on_status(result) 58 except urlfetch.DownloadError as e: 59 raise ClientError(method, url, e) 60 except urlfetch_errors.DeadlineExceededError: 61 raise HttpTimeout(method, url, timeout) 62 63 return result 64 65 @classmethod 66 def raise_on_status(cls, result): 67 status_code = result.status_code 68 if status_code / 100 != 2: 69 if status_code in (400, 403, 404, 409): 70 pass 71 else: 72 raise HTTPError(status_code) 73 74 75 def resolve_http_client(): 76 if requests: 77 log.debug(u'Use `requests` based HTTP client.') 78 return RequestClient 79 if urlfetch and urlfetch_errors: 80 log.debug(u'Use `urlfetch` based HTTP client.') 81 return URLFetchClient 82 raise ImportError(u'Datadog API client was unable to resolve a HTTP client. Please install `requests` library.')