Source code for api4jenkins.http
# encoding: utf-8
import inspect
import logging
from httpx import (AsyncClient, AsyncHTTPTransport, Client, HTTPTransport,
Request, Response)
from .exceptions import AuthenticationError, BadRequestError, ItemNotFoundError
logger = logging.getLogger(__name__)
[docs]
def log_request(request: Request) -> None:
logger.debug(
f"Send Request: {request.method} {request.url} - Waiting for response")
[docs]
def check_response(response: Response) -> None:
if response.is_success or response.is_redirect:
return
if response.status_code == 404:
raise ItemNotFoundError(f'404 Not found {response.url}')
if response.status_code == 401:
raise AuthenticationError(
f'401 Invalid authorization for {response.url}')
if response.status_code == 403:
raise PermissionError(f'403 No permission to access {response.url}')
if response.status_code == 400:
raise BadRequestError(f'400 {response.headers["X-Error"]}')
response.raise_for_status()
def _new_transport(obj, kwargs):
init_args = {
arg: kwargs.pop(arg)
for arg in inspect.getfullargspec(obj).args
if arg in kwargs
}
return obj(**init_args)
[docs]
def new_http_client(**kwargs) -> Client:
trans = _new_transport(HTTPTransport, kwargs)
return Client(
transport=trans,
**kwargs,
event_hooks={'request': [log_request], 'response': [check_response]}
)
[docs]
async def async_log_request(request: Request) -> None:
logger.debug(
f"Send Request: {request.method} {request.url} - Waiting for response")
[docs]
async def async_check_response(response: Response) -> None:
check_response(response)
[docs]
def new_async_http_client(**kwargs) -> AsyncClient:
trans = _new_transport(AsyncHTTPTransport, kwargs)
return AsyncClient(
transport=trans,
**kwargs,
event_hooks={'request': [async_log_request],
'response': [async_check_response]}
)