diff --git a/src/corelibs/requests_handling/caller.py b/src/corelibs/requests_handling/caller.py index e08ea5c..14ff4d6 100644 --- a/src/corelibs/requests_handling/caller.py +++ b/src/corelibs/requests_handling/caller.py @@ -3,32 +3,61 @@ requests lib interface V2 call type """ -from typing import Any -import warnings +from typing import Any, TypedDict, cast import requests -# to hide the verfiy warnings because of the bad SSL settings from Netskope, Akamai, etc -warnings.filterwarnings('ignore', message='Unverified HTTPS request') +from requests import exceptions + + +class ErrorResponse: + """ + Error response structure. This is returned if a request could not be completed + """ + def __init__( + self, + code: int, + message: str, + action: str, + url: str, + exception: exceptions.InvalidSchema | exceptions.ReadTimeout | exceptions.ConnectionError | None = None + ) -> None: + self.code = code + self.message = message + self.action = action + self.url = url + self.exception_name = type(exception).__name__ if exception is not None else None + self.exception_trace = exception if exception is not None else None + + +class ProxyConfig(TypedDict): + """ + Socks proxy settings + """ + type: str + host: str + port: str class Caller: - """_summary_""" + """ + requests lib interface + """ def __init__( self, header: dict[str, str], verify: bool = True, timeout: int = 20, - proxy: dict[str, str] | None = None, - ca_file: str | None = None + proxy: ProxyConfig | None = None, + cafile: str | None = None ): self.headers = header self.timeout: int = timeout - self.cafile = ca_file + self.cafile = cafile self.verify = verify - self.proxy = proxy + self.proxy = cast(dict[str, str], proxy) if proxy is not None else None def __timeout(self, timeout: int | None) -> int: - if timeout is not None: + if timeout is not None and timeout >= 0: return timeout return self.timeout @@ -39,7 +68,7 @@ class Caller: data: dict[str, Any] | None = None, params: dict[str, Any] | None = None, timeout: int | None = None - ) -> requests.Response | None: + ) -> requests.Response | ErrorResponse: """ call wrapper, on error returns None @@ -56,67 +85,96 @@ class Caller: if data is None: data = {} try: - response = None if action == "get": - response = requests.get( + return requests.get( url, params=params, headers=self.headers, timeout=self.__timeout(timeout), verify=self.verify, - proxies=self.proxy + proxies=self.proxy, + cert=self.cafile ) - elif action == "post": - response = requests.post( + if action == "post": + return requests.post( url, params=params, json=data, headers=self.headers, timeout=self.__timeout(timeout), verify=self.verify, - proxies=self.proxy + proxies=self.proxy, + cert=self.cafile ) - elif action == "put": - response = requests.put( + if action == "put": + return requests.put( url, params=params, json=data, headers=self.headers, timeout=self.__timeout(timeout), verify=self.verify, - proxies=self.proxy + proxies=self.proxy, + cert=self.cafile ) - elif action == "patch": - response = requests.patch( + if action == "patch": + return requests.patch( url, params=params, json=data, headers=self.headers, timeout=self.__timeout(timeout), verify=self.verify, - proxies=self.proxy + proxies=self.proxy, + cert=self.cafile ) - elif action == "delete": - response = requests.delete( + if action == "delete": + return requests.delete( url, params=params, headers=self.headers, timeout=self.__timeout(timeout), verify=self.verify, - proxies=self.proxy + proxies=self.proxy, + cert=self.cafile ) - return response - except requests.exceptions.InvalidSchema as e: - print(f"Invalid URL during '{action}' for {url}:\n\t{e}") - return None - except requests.exceptions.ReadTimeout as e: - print(f"Timeout ({self.timeout}s) during '{action}' for {url}:\n\t{e}") - return None - except requests.exceptions.ConnectionError as e: - print(f"Connection error during '{action}' for {url}:\n\t{e}") - return None + return ErrorResponse( + 100, + f"Unsupported action '{action}'", + action, + url + ) + except exceptions.InvalidSchema as e: + return ErrorResponse( + 200, + f"Invalid URL during '{action}' for {url}", + action, + url, + e + ) + except exceptions.ReadTimeout as e: + return ErrorResponse( + 300, + f"Timeout ({self.timeout}s) during '{action}' for {url}", + action, + url, + e + ) + except exceptions.ConnectionError as e: + return ErrorResponse( + 400, + f"Connection error during '{action}' for {url}", + action, + url, + e + ) - def get(self, url: str, params: dict[str, Any] | None = None) -> requests.Response | None: + def get( + self, + url: str, + params: dict[str, Any] | None = None, + timeout: int | None = None + ) -> requests.Response | ErrorResponse: """ get data @@ -127,11 +185,15 @@ class Caller: Returns: requests.Response: _description_ """ - return self.__call('get', url, params=params) + return self.__call('get', url, params=params, timeout=timeout) def post( - self, url: str, data: dict[str, Any] | None = None, params: dict[str, Any] | None = None - ) -> requests.Response | None: + self, + url: str, + data: dict[str, Any] | None = None, + params: dict[str, Any] | None = None, + timeout: int | None = None + ) -> requests.Response | ErrorResponse: """ post data @@ -143,11 +205,15 @@ class Caller: Returns: requests.Response | None: _description_ """ - return self.__call('post', url, data, params) + return self.__call('post', url, data, params, timeout=timeout) def put( - self, url: str, data: dict[str, Any] | None = None, params: dict[str, Any] | None = None - ) -> requests.Response | None: + self, + url: str, + data: dict[str, Any] | None = None, + params: dict[str, Any] | None = None, + timeout: int | None = None + ) -> requests.Response | ErrorResponse: """_summary_ Args: @@ -158,11 +224,15 @@ class Caller: Returns: requests.Response | None: _description_ """ - return self.__call('put', url, data, params) + return self.__call('put', url, data, params, timeout=timeout) def patch( - self, url: str, data: dict[str, Any] | None = None, params: dict[str, Any] | None = None - ) -> requests.Response | None: + self, + url: str, + data: dict[str, Any] | None = None, + params: dict[str, Any] | None = None, + timeout: int | None = None + ) -> requests.Response | ErrorResponse: """_summary_ Args: @@ -173,9 +243,14 @@ class Caller: Returns: requests.Response | None: _description_ """ - return self.__call('patch', url, data, params) + return self.__call('patch', url, data, params, timeout=timeout) - def delete(self, url: str, params: dict[str, Any] | None = None) -> requests.Response | None: + def delete( + self, + url: str, + params: dict[str, Any] | None = None, + timeout: int | None = None + ) -> requests.Response | ErrorResponse: """ delete @@ -186,6 +261,6 @@ class Caller: Returns: requests.Response | None: _description_ """ - return self.__call('delete', url, params=params) + return self.__call('delete', url, params=params, timeout=timeout) # __END__