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: