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
@@ -328,6 +331,43 @@ def test_create_host_config_secopt(self):
328
331
TypeError , self .client .create_host_config , security_opt = 'wrong'
329
332
)
330
333
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
+
331
371
332
372
class StreamTest (base .Cleanup , base .BaseTestCase ):
333
373
def setUp (self ):
0 commit comments