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 Release 0.6.1 #41 #52
Fix connection status code 400 error
Rename connected to opened
Add retry to engineio commands
Run README commands Run README commands
Merge sarietta's pull request Merge sarietta's pull request
Add Websocket transport Add Websocket transport
Update proxy to include websocket depending on argument
Consider logging packets sent and received Consider logging packets sent and received
Implement rooms #65 Implement rooms #65
Implement binary event Implement binary event

View file

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