From b119de48a68b993d984fd53b4be244fe0b07b8fc Mon Sep 17 00:00:00 2001 From: Liora Milbaum Date: Sat, 10 Dec 2022 12:53:04 +0200 Subject: [PATCH] refactor: RequestsResponse --- gitlab/client.py | 4 +-- gitlab/http_backends/__init__.py | 3 +- gitlab/http_backends/requests_backend.py | 36 +++++++++++++++++++++--- 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/gitlab/client.py b/gitlab/client.py index 98f690578..4ad6c8fb6 100644 --- a/gitlab/client.py +++ b/gitlab/client.py @@ -774,10 +774,10 @@ def http_request( raise - self._check_redirects(result) + self._check_redirects(result.response) if 200 <= result.status_code < 300: - return result + return result.response if (429 == result.status_code and obey_rate_limit) or ( result.status_code in gitlab.const.RETRYABLE_TRANSIENT_ERROR_CODES diff --git a/gitlab/http_backends/__init__.py b/gitlab/http_backends/__init__.py index 07b7e80c5..aa53d0a2f 100644 --- a/gitlab/http_backends/__init__.py +++ b/gitlab/http_backends/__init__.py @@ -2,6 +2,7 @@ Defines http backends for processing http requests """ -from .requests_backend import RequestsBackend +from .requests_backend import RequestsBackend, RequestsResponse DefaultBackend = RequestsBackend +DefaultResponse = RequestsResponse diff --git a/gitlab/http_backends/requests_backend.py b/gitlab/http_backends/requests_backend.py index 032597a57..0b310abc8 100644 --- a/gitlab/http_backends/requests_backend.py +++ b/gitlab/http_backends/requests_backend.py @@ -1,9 +1,36 @@ +from __future__ import annotations + from typing import Any, Dict, Optional, Union import requests +from requests.structures import CaseInsensitiveDict from requests_toolbelt.multipart.encoder import MultipartEncoder # type: ignore +class RequestsResponse: + def __init__(self, response: requests.Response) -> None: + self._response: requests.Response = response + + @property + def response(self) -> requests.Response: + return self._response + + @property + def status_code(self) -> int: + return self._response.status_code + + @property + def headers(self) -> CaseInsensitiveDict[str]: + return self._response.headers + + @property + def content(self) -> bytes: + return self._response.content + + def json(self) -> Any: + return self._response.json() + + class RequestsBackend: def __init__(self, session: Optional[requests.Session] = None) -> None: self._client: requests.Session = session or requests.Session() @@ -22,8 +49,8 @@ def http_request( timeout: Optional[float] = None, verify: Optional[Union[bool, str]] = True, stream: Optional[bool] = False, - **kwargs: Any - ) -> requests.Response: + **kwargs: Any, + ) -> RequestsResponse: """Make HTTP request Args: @@ -40,7 +67,7 @@ def http_request( Returns: A requests Response object. """ - return self._client.request( + response: requests.Response = self._client.request( method=method, url=url, params=params, @@ -49,5 +76,6 @@ def http_request( stream=stream, verify=verify, json=json, - **kwargs + **kwargs, ) + return RequestsResponse(response=response)