From a299f2c8ab6e95a4172c6cb580d4776a6a9b8971 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anton=20T=C3=B6rnqvist?= Date: Fri, 9 May 2025 12:56:06 +0200 Subject: [PATCH] Read stream from BufferedReader MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Anton Törnqvist --- docker/api/client.py | 4 ++++ docker/utils/socket.py | 5 +++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/docker/api/client.py b/docker/api/client.py index 394ceb1f..d9c9b1c6 100644 --- a/docker/api/client.py +++ b/docker/api/client.py @@ -1,3 +1,4 @@ +import io import json import struct import urllib @@ -428,6 +429,9 @@ class APIClient( """ socket = self._get_raw_response_socket(response) + if isinstance(response.raw._fp.fp, io.BufferedReader): + socket = response.raw._fp.fp + gen = frames_iter(socket, tty) if demux: diff --git a/docker/utils/socket.py b/docker/utils/socket.py index c7cb584d..10b4e727 100644 --- a/docker/utils/socket.py +++ b/docker/utils/socket.py @@ -1,4 +1,5 @@ import errno +import io import os import select import socket as pysocket @@ -30,7 +31,7 @@ def read(socket, n=4096): recoverable_errors = (errno.EINTR, errno.EDEADLK, errno.EWOULDBLOCK) - if not isinstance(socket, NpipeSocket): + if not isinstance(socket, NpipeSocket) and not isinstance(socket, io.BufferedReader): if not hasattr(select, "poll"): # Limited to 1024 select.select([socket], [], []) @@ -42,7 +43,7 @@ def read(socket, n=4096): try: if hasattr(socket, 'recv'): return socket.recv(n) - if isinstance(socket, pysocket.SocketIO): + if isinstance(socket, pysocket.SocketIO) or isinstance(socket, io.BufferedReader): return socket.read(n) return os.read(socket.fileno(), n) except OSError as e: