NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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.')