22
22
import tempfile
23
23
import threading
24
24
import time
25
+ import io
25
26
26
27
import docker
27
28
import requests
29
+ from requests .packages import urllib3
28
30
import six
29
31
30
32
from .. import base
42
44
43
45
44
46
def response (status_code = 200 , content = '' , headers = None , reason = None , elapsed = 0 ,
45
- request = None ):
47
+ request = None , raw = None ):
46
48
res = requests .Response ()
47
49
res .status_code = status_code
48
50
if not isinstance (content , six .binary_type ):
@@ -52,6 +54,7 @@ def response(status_code=200, content='', headers=None, reason=None, elapsed=0,
52
54
res .reason = reason
53
55
res .elapsed = datetime .timedelta (elapsed )
54
56
res .request = request
57
+ res .raw = raw
55
58
return res
56
59
57
60
@@ -317,6 +320,43 @@ def test_create_host_config_secopt(self):
317
320
TypeError , self .client .create_host_config , security_opt = 'wrong'
318
321
)
319
322
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
+
320
360
321
361
class StreamTest (base .Cleanup , base .BaseTestCase ):
322
362
def setUp (self ):
0 commit comments