Retry failed commands

This commit is contained in:
Roy Hyunjin Han 2015-02-23 08:56:00 -05:00
commit 0d1a2b9ca2
2 changed files with 26 additions and 10 deletions

View file

@ -1,10 +1,8 @@
Release 0.6.1 #41 #52
Fix connection status code 400 error
Rename connected to opened
Add retry to engineio commands
Run README commands
Merge sarietta's pull request
Add Websocket transport
Update proxy to include websocket depending on argument
Consider logging packets sent and received
Implement rooms #65
Implement binary event

View file

@ -18,6 +18,17 @@ BaseNamespace = SocketIONamespace
LoggingNamespace = LoggingSocketIONamespace
def retry(f):
def wrap(*args, **kw):
self = args[0]
try:
return f(*args, **kw)
except (TimeoutError, ConnectionError):
self._opened = False
return f(*args, **kw)
return wrap
class EngineIO(LoggingMixin):
def __init__(
@ -28,10 +39,10 @@ class EngineIO(LoggingMixin):
self._wait_for_connection = wait_for_connection
self._client_transports = transports
self._hurry_interval_in_seconds = hurry_interval_in_seconds
self._http_session = prepare_http_session(kw)
self._kw = kw
self._log_name = self._url
self._wants_to_close = False
self.connected = False
self._opened = False
if Namespace:
self.define(Namespace)
@ -39,17 +50,18 @@ class EngineIO(LoggingMixin):
@property
def _transport(self):
if self.connected:
if self._opened:
return self._transport_instance
self._engineIO_session = self._get_engineIO_session()
self._transport_instance = self._negotiate_transport()
self._connect_namespaces()
self.connected = True
self._opened = True
self._reset_heartbeat()
return self._transport_instance
def _get_engineIO_session(self):
warning_screen = self._yield_warning_screen()
self._http_session = prepare_http_session(self._kw)
for elapsed_time in warning_screen:
transport = XHR_PollingTransport(
self._http_session, self._is_secure, self._url)
@ -130,34 +142,40 @@ class EngineIO(LoggingMixin):
def send(self, engineIO_packet_data):
self._message(engineIO_packet_data)
@retry
def _open(self):
engineIO_packet_type = 0
self._transport.send_packet(engineIO_packet_type, '')
def _close(self):
self._wants_to_close = True
if not self.connected:
if not self._opened:
return
engineIO_packet_type = 1
self._transport.send_packet(engineIO_packet_type, '')
self.connected = False
self._opened = False
@retry
def _ping(self, engineIO_packet_data=''):
engineIO_packet_type = 2
self._transport.send_packet(engineIO_packet_type, engineIO_packet_data)
@retry
def _pong(self, engineIO_packet_data=''):
engineIO_packet_type = 3
self._transport.send_packet(engineIO_packet_type, engineIO_packet_data)
@retry
def _message(self, engineIO_packet_data):
engineIO_packet_type = 4
self._transport.send_packet(engineIO_packet_type, engineIO_packet_data)
@retry
def _upgrade(self):
engineIO_packet_type = 5
self._transport.send_packet(engineIO_packet_type, '')
@retry
def _noop(self):
engineIO_packet_type = 6
self._transport.send_packet(engineIO_packet_type, '')
@ -317,7 +335,7 @@ class SocketIO(EngineIO):
self._message(str(socketIO_packet_type) + socketIO_packet_data)
def disconnect(self, path=''):
if not self.connected:
if not self._opened:
return
if path:
socketIO_packet_type = 1