summaryrefslogtreecommitdiff
path: root/gitlab/_backends
diff options
context:
space:
mode:
Diffstat (limited to 'gitlab/_backends')
-rw-r--r--gitlab/_backends/protocol.py14
-rw-r--r--gitlab/_backends/requests_backend.py30
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,