Skip to content

Commit fb41965

Browse files
authored
Merge pull request #1082 from masci/fix_stream_helper
Invoke self._result passing `json=True` when `decode=True`
2 parents d33e069 + 86d1b8f commit fb41965

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
@@ -268,7 +268,7 @@ def _stream_helper(self, response, decode=False):
268268
else:
269269
# Response isn't chunked, meaning we probably
270270
# encountered an error immediately
271-
yield self._result(response)
271+
yield self._result(response, json=decode)
272272

273273
def _multiplexed_buffer_helper(self, response):
274274
"""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

@@ -328,6 +331,43 @@ def test_create_host_config_secopt(self):
328331
TypeError, self.client.create_host_config, security_opt='wrong'
329332
)
330333

334+
def test_stream_helper_decoding(self):
335+
status_code, content = fake_api.fake_responses[url_prefix + 'events']()
336+
content_str = json.dumps(content)
337+
if six.PY3:
338+
content_str = content_str.encode('utf-8')
339+
body = io.BytesIO(content_str)
340+
341+
# mock a stream interface
342+
raw_resp = urllib3.HTTPResponse(body=body)
343+
setattr(raw_resp._fp, 'chunked', True)
344+
setattr(raw_resp._fp, 'chunk_left', len(body.getvalue())-1)
345+
346+
# pass `decode=False` to the helper
347+
raw_resp._fp.seek(0)
348+
resp = response(status_code=status_code, content=content, raw=raw_resp)
349+
result = next(self.client._stream_helper(resp))
350+
self.assertEqual(result, content_str)
351+
352+
# pass `decode=True` to the helper
353+
raw_resp._fp.seek(0)
354+
resp = response(status_code=status_code, content=content, raw=raw_resp)
355+
result = next(self.client._stream_helper(resp, decode=True))
356+
self.assertEqual(result, content)
357+
358+
# non-chunked response, pass `decode=False` to the helper
359+
setattr(raw_resp._fp, 'chunked', False)
360+
raw_resp._fp.seek(0)
361+
resp = response(status_code=status_code, content=content, raw=raw_resp)
362+
result = next(self.client._stream_helper(resp))
363+
self.assertEqual(result, content_str.decode('utf-8'))
364+
365+
# non-chunked response, pass `decode=True` to the helper
366+
raw_resp._fp.seek(0)
367+
resp = response(status_code=status_code, content=content, raw=raw_resp)
368+
result = next(self.client._stream_helper(resp, decode=True))
369+
self.assertEqual(result, content)
370+
331371

332372
class StreamTest(base.Cleanup, base.BaseTestCase):
333373
def setUp(self):

0 commit comments

Comments
 (0)