Source code for pyrestsdk.middleware.authorizationhandler._kerbose_authorization_handler
"""Houses Kerbose Authorization Handler"""
from typing import Optional, TypeVar, Union, Tuple, Mapping
from requests import PreparedRequest, Response
from requests_kerberos import HTTPKerberosAuth, OPTIONAL
from pyrestsdk.middleware import BaseAuthorizationHandler
from pyrestsdk.credential import AbstractKerbroseCredential
from pyrestsdk.type.enum import FeatureUsageFlag
T = TypeVar("T", bound=AbstractKerbroseCredential)
A = TypeVar("A", bound="KerboseAuthorizationHandler")
[docs]class KerboseAuthorizationHandler(BaseAuthorizationHandler):
"""Kerbose Authorization Handler Type"""
credential: T
def __init__(self, credential: T, **kwargs) -> None:
super().__init__(credential, **kwargs)
[docs] def send(
self: A,
request: PreparedRequest,
stream: bool = False,
timeout: Optional[Union[float, Tuple[float, float], Tuple[float, None]]] = None,
verify: bool = True,
cert: Optional[
Union[bytes, str, Tuple[Union[bytes, str], Union[bytes, str]]]
] = None,
proxies: Optional[Mapping[str, str]] = None,
) -> Response:
"""Makes a network request if next is none, otherwise requests the next middleware to do so
Args:
request (PreparedRequest): The network request
Returns:
Response: Response from network request
"""
context = request.context # type: ignore
# TODO break dependancy for requests_kerberos module
request.prepare_auth(
HTTPKerberosAuth(
mutual_authentication=OPTIONAL, principal=self._get_principle()
)
)
context.set_feature_usage = FeatureUsageFlag.AUTH_HANDLER_ENABLED
response = super().send(request, stream, timeout, verify, cert, proxies)
# Token might have expired just before transmission, retry the request one more time
if response.status_code == 401 and self.retry_count < 2:
self.retry_count += 1
return self.send(request, stream, timeout, verify, cert, proxies)
return response
def _get_principle(self: A) -> str:
"""Gets the encoded string from the credential's get_principle() function"""
return self.credential.get_principle()