diff --git a/socketIO_client/__init__.py b/socketIO_client/__init__.py index c27009b..899cc32 100644 --- a/socketIO_client/__init__.py +++ b/socketIO_client/__init__.py @@ -247,7 +247,7 @@ class SocketIO(object): break try: try: - self._process_events() + self._process_events(timeout=seconds) except TimeoutError: pass self.heartbeat_pacemaker.next() @@ -259,8 +259,8 @@ class SocketIO(object): self.log(logging.WARNING, warning) self.disconnect() - def _process_events(self): - for packet in self._transport.recv_packet(): + def _process_events(self, timeout=None): + for packet in self._transport.recv_packet(timeout): try: self._process_packet(packet) except PacketError as e: diff --git a/socketIO_client/transports.py b/socketIO_client/transports.py index c816dcc..0cfe6c6 100644 --- a/socketIO_client/transports.py +++ b/socketIO_client/transports.py @@ -76,14 +76,14 @@ class _AbstractTransport(object): self.send(packet_text) self._log(logging.DEBUG, '[packet sent] %s', packet_text) - def recv_packet(self): + def recv_packet(self, timeout=None): try: while self._packets: yield self._packets.pop(0) except IndexError: pass - for packet_text in self.recv(): - self._log(logging.DEBUG, '[packet received] %s', packet_text) + for packet_text in self.recv(timeout=timeout): + _log.debug('[packet received] %s', packet_text) try: packet_parts = packet_text.split(':', 3) except AttributeError: @@ -154,7 +154,9 @@ class _WebsocketTransport(_AbstractTransport): self._log(logging.WARNING, message) raise ConnectionError(message) - def recv(self): + def recv(self, timeout=None): + if timeout: + self._connection.settimeout(timeout) try: yield self._connection.recv() except websocket.WebSocketTimeoutException as e: @@ -202,12 +204,12 @@ class _XHR_PollingTransport(_AbstractTransport): data=packet_text, timeout=TIMEOUT_IN_SECONDS) - def recv(self): + def recv(self, timeout=None): response = _get_response( self._http_session.get, self._url, params=self._params, - timeout=TIMEOUT_IN_SECONDS, + timeout=timeout or TIMEOUT_IN_SECONDS, stream=True) response_text = response.text if not response_text.startswith(BOUNDARY): @@ -257,14 +259,14 @@ class _JSONP_PollingTransport(_AbstractTransport): headers={'content-type': 'application/x-www-form-urlencoded'}, timeout=TIMEOUT_IN_SECONDS) - def recv(self): + def recv(self, timeout=None): 'Decode the JavaScript response so that we can parse it as JSON' response = _get_response( self._http_session.get, self._url, params=self._params, headers={'content-type': 'text/javascript; charset=UTF-8'}, - timeout=TIMEOUT_IN_SECONDS) + timeout=timeout or TIMEOUT_IN_SECONDS) response_text = response.text try: self._id, response_text = self.RESPONSE_PATTERN.match(