Kaydet (Commit) dbe52dcb authored tarafından Joffrey F's avatar Joffrey F Kaydeden (comit) Joffrey F

Fix socket reading function for TCP (non-HTTPS) connections on Windows

Signed-off-by: 's avatarJoffrey F <joffrey@docker.com>
üst 49bb7386
import errno import errno
import os import os
import select import select
import socket as pysocket
import struct import struct
import six import six
...@@ -28,6 +29,8 @@ def read(socket, n=4096): ...@@ -28,6 +29,8 @@ def read(socket, n=4096):
try: try:
if hasattr(socket, 'recv'): if hasattr(socket, 'recv'):
return socket.recv(n) return socket.recv(n)
if six.PY3 and isinstance(socket, getattr(pysocket, 'SocketIO')):
return socket.read(n)
return os.read(socket.fileno(), n) return os.read(socket.fileno(), n)
except EnvironmentError as e: except EnvironmentError as e:
if e.errno not in recoverable_errors: if e.errno not in recoverable_errors:
......
...@@ -365,7 +365,7 @@ class DockerApiTest(BaseAPIClientTest): ...@@ -365,7 +365,7 @@ class DockerApiTest(BaseAPIClientTest):
assert result == content assert result == content
class StreamTest(unittest.TestCase): class UnixSocketStreamTest(unittest.TestCase):
def setUp(self): def setUp(self):
socket_dir = tempfile.mkdtemp() socket_dir = tempfile.mkdtemp()
self.build_context = tempfile.mkdtemp() self.build_context = tempfile.mkdtemp()
...@@ -462,7 +462,61 @@ class StreamTest(unittest.TestCase): ...@@ -462,7 +462,61 @@ class StreamTest(unittest.TestCase):
raise e raise e
assert list(stream) == [ assert list(stream) == [
str(i).encode() for i in range(50)] str(i).encode() for i in range(50)
]
class TCPSocketStreamTest(unittest.TestCase):
text_data = b'''
Now, those children out there, they're jumping through the
flames in the hope that the god of the fire will make them fruitful.
Really, you can't blame them. After all, what girl would not prefer the
child of a god to that of some acne-scarred artisan?
'''
def setUp(self):
self.server = six.moves.socketserver.ThreadingTCPServer(
('', 0), self.get_handler_class()
)
self.thread = threading.Thread(target=self.server.serve_forever)
self.thread.setDaemon(True)
self.thread.start()
self.address = 'http://{}:{}'.format(
socket.gethostname(), self.server.server_address[1]
)
def tearDown(self):
self.server.shutdown()
self.server.server_close()
self.thread.join()
def get_handler_class(self):
text_data = self.text_data
class Handler(six.moves.BaseHTTPServer.BaseHTTPRequestHandler, object):
def do_POST(self):
self.send_response(101)
self.send_header(
'Content-Type', 'application/vnd.docker.raw-stream'
)
self.send_header('Connection', 'Upgrade')
self.send_header('Upgrade', 'tcp')
self.end_headers()
self.wfile.flush()
time.sleep(0.2)
self.wfile.write(text_data)
self.wfile.flush()
return Handler
def test_read_from_socket(self):
with APIClient(base_url=self.address) as client:
resp = client._post(client._url('/dummy'), stream=True)
data = client._read_from_socket(resp, stream=True, tty=True)
results = b''.join(data)
assert results == self.text_data
class UserAgentTest(unittest.TestCase): class UserAgentTest(unittest.TestCase):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment