diff options
Diffstat (limited to 'gitlab/_backends')
-rw-r--r-- | gitlab/_backends/protocol.py | 14 | ||||
-rw-r--r-- | gitlab/_backends/requests_backend.py | 30 |
2 files changed, 42 insertions, 2 deletions
diff --git a/gitlab/_backends/protocol.py b/gitlab/_backends/protocol.py index f89740b..3f8af3d 100644 --- a/gitlab/_backends/protocol.py +++ b/gitlab/_backends/protocol.py @@ -1,6 +1,6 @@ import abc import sys -from typing import Any, Dict, Optional, Union +from typing import Any, Callable, Dict, Iterator, Optional, Union import requests from requests_toolbelt.multipart.encoder import MultipartEncoder # type: ignore @@ -18,6 +18,18 @@ class BackendResponse(Protocol): class Backend(Protocol): + @staticmethod + @abc.abstractmethod + def response_content( + response: requests.Response, + streamed: bool, + action: Optional[Callable[[bytes], None]], + chunk_size: int, + *, + iterator: bool, + ) -> Optional[Union[bytes, Iterator[Any]]]: + ... + @abc.abstractmethod def http_request( self, diff --git a/gitlab/_backends/requests_backend.py b/gitlab/_backends/requests_backend.py index fd40baa..45592ee 100644 --- a/gitlab/_backends/requests_backend.py +++ b/gitlab/_backends/requests_backend.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Any, Dict, Optional, Tuple, TYPE_CHECKING, Union +from typing import Any, Callable, Dict, Iterator, Optional, Tuple, TYPE_CHECKING, Union import requests from requests.structures import CaseInsensitiveDict @@ -9,6 +9,11 @@ from requests_toolbelt.multipart.encoder import MultipartEncoder # type: ignore from . import protocol +class _StdoutStream: + def __call__(self, chunk: Any) -> None: + print(chunk) + + class RequestsResponse(protocol.BackendResponse): def __init__(self, response: requests.Response) -> None: self._response: requests.Response = response @@ -77,6 +82,29 @@ class RequestsBackend(protocol.Backend): return (post_data, None, "application/json") + @staticmethod + def response_content( + response: requests.Response, + streamed: bool, + action: Optional[Callable[[bytes], None]], + chunk_size: int, + *, + iterator: bool, + ) -> Optional[Union[bytes, Iterator[Any]]]: + if iterator: + return response.iter_content(chunk_size=chunk_size) + + if streamed is False: + return response.content + + if action is None: + action = _StdoutStream() + + for chunk in response.iter_content(chunk_size=chunk_size): + if chunk: + action(chunk) + return None + def http_request( self, method: str, |