@@ -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 ):
0 commit comments