import platform
import uuid
from requests import Request, Session, hooks
from urllib.parse import urljoin
from identixone import __version__
from identixone.http.auth import IdentixOneAuth
from identixone.utils import constants
[docs]class IdentixOneHttpClient(object):
"""
Http client used to make actual HTTP requests to Identix.one API.
You can subclass it and provide new class as http_client param into Client.
"""
def __init__(self, auth_token, request_hooks=None, timeout=None):
self.auth = IdentixOneAuth(token=auth_token)
self.session = Session()
self.request_hooks = request_hooks or hooks.default_hooks()
self.timeout = timeout or constants.HTTP_CLIENT_TIMEOUT
self.base_url = constants.HTTP_CLIENT_BASE_URL
@property
def common_headers(self):
return {
'User-Agent': 'identixone-python/{} (Python {})'.format(
__version__, platform.python_version()),
'Request-ID': str(uuid.uuid4())
}
[docs] def get(self, url, params=None, data=None, files=None,
headers=None, auth=None):
return self.request(
method='GET', url=url, params=params,
data=data, files=files, headers=headers, auth=auth)
[docs] def post(self, url, params=None, data=None, files=None,
headers=None, auth=None):
return self.request(
method='POST', url=url, params=params,
data=data, files=files, headers=headers, auth=auth)
[docs] def patch(self, url, params=None, data=None, files=None,
headers=None, auth=None):
return self.request(
method='PATCH', url=url, params=params,
data=data, files=files, headers=headers, auth=auth)
[docs] def delete(self, url, params=None, data=None, files=None,
headers=None, auth=None):
return self.request(
method='DELETE', url=url, params=params,
data=data, files=files, headers=headers, auth=auth)
[docs] def request(self, method, url, params=None, data=None, files=None,
headers=None, auth=None):
method = method.upper()
full_url = urljoin(self.base_url, url)
headers = headers or {}
headers.update(self.common_headers)
if 'Accept' not in headers:
headers['Accept'] = 'application/json'
self.session.auth = auth or self.auth
self.session.headers.update(headers)
request = Request(**{
'method': method,
'url': full_url,
'params': params,
'data': data,
'files': files,
'headers': headers,
'hooks': self.request_hooks
})
prepped_request = self.session.prepare_request(request)
return self.session.send(
prepped_request,
allow_redirects=False,
timeout=self.timeout,
)