Skip to content

Commit 9ff68ce

Browse files
committed
Support using just the websocket transport
1 parent 9e9e66c commit 9ff68ce

File tree

4 files changed

+52
-21
lines changed

4 files changed

+52
-21
lines changed

socketIO_client/__init__.py

Lines changed: 37 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ def __init__(
5959
def _transport(self):
6060
if self._opened:
6161
return self._transport_instance
62+
self._engineIO_session = None
6263
self._engineIO_session = self._get_engineIO_session()
6364
self._negotiate_transport()
6465
self._connect_namespaces()
@@ -67,41 +68,56 @@ def _transport(self):
6768
return self._transport_instance
6869

6970
def _get_engineIO_session(self):
71+
self.transport_name = self._client_transports[0]
72+
self._transport_instance = self._get_transport(self.transport_name)
73+
7074
warning_screen = self._yield_warning_screen()
7175
for elapsed_time in warning_screen:
72-
transport = XHR_PollingTransport(
73-
self._http_session, self._is_secure, self._url)
7476
try:
7577
engineIO_packet_type, engineIO_packet_data = next(
76-
transport.recv_packet())
78+
self._transport_instance.recv_packet())
7779
break
7880
except (TimeoutError, ConnectionError) as e:
7981
if not self._wait_for_connection:
8082
raise
8183
warning = Exception(
8284
'[engine.io waiting for connection] %s' % e)
8385
warning_screen.throw(warning)
86+
8487
assert engineIO_packet_type == 0 # engineIO_packet_type == open
85-
return parse_engineIO_session(engineIO_packet_data)
88+
session = parse_engineIO_session(engineIO_packet_data)
89+
# Set the timeout on the WebSocket transport if needed, since we didn't
90+
# have it earlier.
91+
self._transport_instance.set_timeout(session.ping_timeout)
92+
return session
8693

8794
def _negotiate_transport(self):
88-
self._transport_instance = self._get_transport('xhr-polling')
89-
self.transport_name = 'xhr-polling'
90-
is_ws_client = 'websocket' in self._client_transports
91-
is_ws_server = 'websocket' in self._engineIO_session.transport_upgrades
92-
if is_ws_client and is_ws_server:
93-
try:
94-
transport = self._get_transport('websocket')
95-
transport.send_packet(2, 'probe')
96-
for packet_type, packet_data in transport.recv_packet():
97-
if packet_type == 3 and packet_data == b'probe':
98-
transport.send_packet(5, '')
99-
self._transport_instance = transport
100-
self.transport_name = 'websocket'
101-
else:
102-
self._warn('unexpected engine.io packet')
103-
except Exception:
104-
pass
95+
if self.transport_name != 'websocket':
96+
# If not using websocket transport, recreate initial transport with
97+
# session information. This is essentially free and ensures correct
98+
# initialization.
99+
self.transport_name = self._client_transports[0]
100+
self._transport_instance = self._get_transport(self.transport_name)
101+
102+
# Attempt to upgrade to websocket transport if possible.
103+
is_ws_client = \
104+
'websocket' in self._client_transports
105+
is_ws_server = \
106+
'websocket' in self._engineIO_session.transport_upgrades
107+
if is_ws_client and is_ws_server:
108+
try:
109+
transport = self._get_transport('websocket')
110+
transport.send_packet(2, 'probe')
111+
for packet_type, packet_data in transport.recv_packet():
112+
if packet_type == 3 and packet_data == b'probe':
113+
transport.send_packet(5, '')
114+
self._transport_instance = transport
115+
self.transport_name = 'websocket'
116+
else:
117+
self._warn('unexpected engine.io packet')
118+
except Exception:
119+
pass
120+
105121
self._debug('[engine.io transport selected] %s', self.transport_name)
106122

107123
def _reset_heartbeat(self):

socketIO_client/tests/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
node_modules

socketIO_client/tests/__init__.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,16 @@ def setUp(self):
323323
self.assertEqual(self.socketIO.transport_name, 'websocket')
324324

325325

326+
class Test_WebsocketTransport_Only(BaseMixin, TestCase):
327+
328+
def setUp(self):
329+
super(Test_WebsocketTransport_Only, self).setUp()
330+
self.socketIO = SocketIO(HOST, PORT, LoggingNamespace, transports=[
331+
'websocket'], verify=False)
332+
self.assertEqual(self.socketIO.transport_name, 'websocket')
333+
self.assertEqual(self.socketIO._transport._timeout, 60)
334+
335+
326336
class Namespace(LoggingNamespace):
327337

328338
def initialize(self):

socketIO_client/transports.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,8 @@ def __init__(self, http_session, is_secure, url, engineIO_session=None):
118118
if engineIO_session:
119119
params['sid'] = engineIO_session.id
120120
kw['timeout'] = self._timeout = engineIO_session.ping_timeout
121+
else:
122+
self._timeout = None
121123
ws_url = '%s://%s/?%s' % (
122124
'wss' if is_secure else 'ws', url, format_query(params))
123125
http_scheme = 'https' if is_secure else 'http'
@@ -168,6 +170,8 @@ def send_packet(self, engineIO_packet_type, engineIO_packet_data=''):
168170
raise ConnectionError('send disconnected (%s)' % e)
169171

170172
def set_timeout(self, seconds=None):
173+
if self._timeout is None:
174+
self._timeout = seconds
171175
self._connection.settimeout(seconds or self._timeout)
172176

173177

0 commit comments

Comments
 (0)