Skip to content

Commit 86d1b8f

Browse files
author
Massimiliano Pippi
committed
invoke self._result with json=True if decode=True
Signed-off-by: Massimiliano Pippi <[email protected]>
1 parent 88811a2 commit 86d1b8f

File tree

2 files changed

+42
-2
lines changed

2 files changed

+42
-2
lines changed

docker/client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ def _stream_helper(self, response, decode=False):
235235
else:
236236
# Response isn't chunked, meaning we probably
237237
# encountered an error immediately
238-
yield self._result(response)
238+
yield self._result(response, json=decode)
239239

240240
def _multiplexed_buffer_helper(self, response):
241241
"""A generator of multiplexed data blocks read from a buffered

tests/unit/api_test.py

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,11 @@
2222
import tempfile
2323
import threading
2424
import time
25+
import io
2526

2627
import docker
2728
import requests
29+
from requests.packages import urllib3
2830
import six
2931

3032
from .. import base
@@ -42,7 +44,7 @@
4244

4345

4446
def response(status_code=200, content='', headers=None, reason=None, elapsed=0,
45-
request=None):
47+
request=None, raw=None):
4648
res = requests.Response()
4749
res.status_code = status_code
4850
if not isinstance(content, six.binary_type):
@@ -52,6 +54,7 @@ def response(status_code=200, content='', headers=None, reason=None, elapsed=0,
5254
res.reason = reason
5355
res.elapsed = datetime.timedelta(elapsed)
5456
res.request = request
57+
res.raw = raw
5558
return res
5659

5760

@@ -317,6 +320,43 @@ def test_create_host_config_secopt(self):
317320
TypeError, self.client.create_host_config, security_opt='wrong'
318321
)
319322

323+
def test_stream_helper_decoding(self):
324+
status_code, content = fake_api.fake_responses[url_prefix + 'events']()
325+
content_str = json.dumps(content)
326+
if six.PY3:
327+
content_str = content_str.encode('utf-8')
328+
body = io.BytesIO(content_str)
329+
330+
# mock a stream interface
331+
raw_resp = urllib3.HTTPResponse(body=body)
332+
setattr(raw_resp._fp, 'chunked', True)
333+
setattr(raw_resp._fp, 'chunk_left', len(body.getvalue())-1)
334+
335+
# pass `decode=False` to the helper
336+
raw_resp._fp.seek(0)
337+
resp = response(status_code=status_code, content=content, raw=raw_resp)
338+
result = next(self.client._stream_helper(resp))
339+
self.assertEqual(result, content_str)
340+
341+
# pass `decode=True` to the helper
342+
raw_resp._fp.seek(0)
343+
resp = response(status_code=status_code, content=content, raw=raw_resp)
344+
result = next(self.client._stream_helper(resp, decode=True))
345+
self.assertEqual(result, content)
346+
347+
# non-chunked response, pass `decode=False` to the helper
348+
setattr(raw_resp._fp, 'chunked', False)
349+
raw_resp._fp.seek(0)
350+
resp = response(status_code=status_code, content=content, raw=raw_resp)
351+
result = next(self.client._stream_helper(resp))
352+
self.assertEqual(result, content_str.decode('utf-8'))
353+
354+
# non-chunked response, pass `decode=True` to the helper
355+
raw_resp._fp.seek(0)
356+
resp = response(status_code=status_code, content=content, raw=raw_resp)
357+
result = next(self.client._stream_helper(resp, decode=True))
358+
self.assertEqual(result, content)
359+
320360

321361
class StreamTest(base.Cleanup, base.BaseTestCase):
322362
def setUp(self):

0 commit comments

Comments
 (0)