Source code for aiosnow.client
from typing import Any, Type, Union
from aiohttp import BasicAuth, ClientSession, TCPConnector
from aiosnow.config import ConfigSchema
from aiosnow.exceptions import MissingClientAuthentication
from aiosnow.request import Response
from aiosnow.utils import get_url
[docs]class Client:
"""Client for communicating with ServiceNow
Parses client config and provides a ClientSession factory.
Args:
address: Instance TCP address, example: my-instance.service-now.com
basic_auth: Tuple of (username, password)
use_ssl: Whether to use SSL
verify_ssl: Whether to verify SSL certificates
pool_size: Connection pool size
response_cls: Custom Response class
Attributes:
config: Client configuration object
"""
def __init__(
self,
address: Union[str, bytes],
basic_auth: tuple = None,
use_ssl: bool = True,
verify_ssl: bool = None,
pool_size: int = 100,
response_cls: Type[Response] = None,
session_cls: Type[ClientSession] = None,
):
# Load config
self.config = ConfigSchema(many=False).load(
dict(
address=address,
session=dict(
basic_auth=basic_auth,
use_ssl=use_ssl or True,
verify_ssl=verify_ssl or True,
),
)
)
if self.config.session.basic_auth:
self._auth = BasicAuth(*self.config.session.basic_auth) # type: ignore
else:
raise MissingClientAuthentication(
"No known authentication methods was provided"
)
if session_cls and not issubclass(session_cls, ClientSession):
raise TypeError(
f"Client :session: ({session_cls}) is not of {ClientSession} type"
)
if response_cls and not issubclass(response_cls, Response):
raise TypeError(
f"Client :response_cls: ({response_cls}) is not of {Response} type"
)
self.session_cls = session_cls or ClientSession
self.response_cls = response_cls or Response
self.base_url = get_url(str(self.config.address), bool(use_ssl))
self.pool_size = pool_size
def get_session(self) -> Any:
connector_args = dict(limit=self.pool_size) # type: Any
if self.config.session.use_ssl:
connector_args["verify_ssl"] = self.config.session.verify_ssl
return self.session_cls(
auth=self._auth,
skip_auto_headers=["Content-Type"],
response_class=self.response_cls,
connector=TCPConnector(**connector_args),
)