From 8f97e73bacf7dffc7135e87fd9902e243bcb1503 Mon Sep 17 00:00:00 2001 From: drewhutchison Date: Wed, 12 Feb 2014 15:07:36 -0700 Subject: [PATCH 1/8] check for exit condition before transport reconnects --- socketIO_client/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/socketIO_client/__init__.py b/socketIO_client/__init__.py index 3bdecf1..1bccef5 100644 --- a/socketIO_client/__init__.py +++ b/socketIO_client/__init__.py @@ -170,13 +170,13 @@ class SocketIO(object): try: warning_screen = _yield_warning_screen(seconds) for elapsed_time in warning_screen: + if self._stop_waiting(for_callbacks): + break try: try: self._process_events() except TimeoutError: pass - if self._stop_waiting(for_callbacks): - break self.heartbeat_pacemaker.send(elapsed_time) except ConnectionError as e: try: From 9285f3da029e413018d65b90ac9cb12b6c18b6de Mon Sep 17 00:00:00 2001 From: Patrick Huber Date: Mon, 28 Jul 2014 09:06:51 +0200 Subject: [PATCH 2/8] allow to pass in a different resource than just 'socket.io' --- README.rst | 9 +++++---- socketIO_client/__init__.py | 13 ++++++++----- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/README.rst b/README.rst index 64dc5cd..cd5bb11 100644 --- a/README.rst +++ b/README.rst @@ -121,7 +121,8 @@ Specify params, headers, cookies, proxies thanks to the `requests`_ library. :: from socketIO_client import SocketIO from base64 import b64encode - SocketIO('localhost', 8000, + SocketIO('localhost', 8000, + resource='my.io', params={'q': 'qqq'}, headers={'Authorization': 'Basic ' + b64encode('username:password')}, cookies={'a': 'aaa'}, @@ -149,7 +150,7 @@ Credits - `Paul Kienzle`_, `Zac Lee`_, `Josh VanderLinden`_, `Ian Fitzpatrick`_, `Lucas Klein`_, `Rui Chicoria`_, `Travis Odom`_ submitted code to expand support of the socket.io protocol. - `Bernard Pratz`_ and `Francis Bull`_ wrote prototypes to support xhr-polling and jsonp-polling. - `Eric Chen`_, `Denis Zinevich`_, `Thiago Hersan`_, `Nayef Copty`_ suggested ways to make the connection more robust. - + .. _socket.io: http://socket.io .. _requests: http://python-requests.org @@ -175,8 +176,8 @@ Credits .. _Lucas Klein: https://github.com/lukashed .. _Rui Chicoria: https://github.com/rchicoria .. _Travis Odom: https://github.com/burstaholic - .. _Eric Chen: https://github.com/taiyangc -.. _Denis Zinevich: https://github.com/dzinevich +.. _Denis Zinevich: https://github.com/dzinevich .. _Thiago Hersan: https://github.com/thiagohersan .. _Nayef Copty: https://github.com/nayefc +.. _Patrick Huber: https://github.com/stackmagic diff --git a/socketIO_client/__init__.py b/socketIO_client/__init__.py index 3bdecf1..00ca9c3 100644 --- a/socketIO_client/__init__.py +++ b/socketIO_client/__init__.py @@ -20,6 +20,7 @@ RETRY_INTERVAL_IN_SECONDS = 1 class BaseNamespace(object): + 'Define client behavior' def __init__(self, _transport, path): @@ -109,6 +110,7 @@ class BaseNamespace(object): class SocketIO(object): + """Create a socket.io client that connects to a socket.io server at the specified host and port. @@ -119,6 +121,7 @@ class SocketIO(object): - Pass query params, headers, cookies, proxies as keyword arguments. SocketIO('localhost', 8000, + resource='my.io', params={'q': 'qqq'}, headers={'Authorization': 'Basic ' + b64encode('username:password')}, cookies={'a': 'aaa'}, @@ -127,8 +130,8 @@ class SocketIO(object): def __init__( self, host, port=None, Namespace=BaseNamespace, - wait_for_connection=True, transports=TRANSPORTS, **kw): - self.is_secure, self.base_url = _parse_host(host, port) + wait_for_connection=True, transports=TRANSPORTS, resource='socket.io', **kw): + self.is_secure, self.base_url = _parse_host(host, port, resource) self.wait_for_connection = wait_for_connection self._namespace_by_path = {} self.client_supported_transports = transports @@ -361,14 +364,14 @@ def find_callback(args, kw=None): return None, args -def _parse_host(host, port): +def _parse_host(host, port, resource): if not host.startswith('http'): host = 'http://' + host url_pack = urlparse(host) is_secure = url_pack.scheme == 'https' port = port or url_pack.port or (443 if is_secure else 80) - base_url = '%s:%d%s/socket.io/%s' % ( - url_pack.hostname, port, url_pack.path, PROTOCOL_VERSION) + base_url = '%s:%d%s/%s/%s' % ( + url_pack.hostname, port, url_pack.path, resource, PROTOCOL_VERSION) return is_secure, base_url From 557edb862028fcbec1a61d053d38812e4d85a1dc Mon Sep 17 00:00:00 2001 From: jorgen Date: Mon, 15 Sep 2014 21:39:11 +0200 Subject: [PATCH 3/8] SSL Timeout error --- setup.py | 2 +- socketIO_client/transports.py | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 639cb7d..76b5152 100644 --- a/setup.py +++ b/setup.py @@ -9,7 +9,7 @@ CHANGES = open(os.path.join(here, 'CHANGES.rst')).read() setup( name='socketIO-client', - version='0.5.3', + version='0.5.3b', description='A socket.io client library', long_description=README + '\n\n' + CHANGES, license='MIT', diff --git a/socketIO_client/transports.py b/socketIO_client/transports.py index ed4e59c..a49c0d9 100644 --- a/socketIO_client/transports.py +++ b/socketIO_client/transports.py @@ -151,7 +151,10 @@ class _WebsocketTransport(_AbstractTransport): except websocket.WebSocketTimeoutException as e: raise TimeoutError(e) except websocket.SSLError as e: - raise ConnectionError(e) + if e.message == "The read operation timed out": + raise TimeoutError(e) + else: + raise ConnectionError(e) except websocket.WebSocketConnectionClosedException as e: raise ConnectionError('connection closed (%s)' % e) except socket.error as e: From 9a80988e263e7c46b2f06b76ff3a5ac14a74ee6b Mon Sep 17 00:00:00 2001 From: antonzy Date: Mon, 22 Sep 2014 17:08:44 +0300 Subject: [PATCH 4/8] Migrate to 3.4 --- socketIO_client/__init__.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/socketIO_client/__init__.py b/socketIO_client/__init__.py index 3bdecf1..f785919 100644 --- a/socketIO_client/__init__.py +++ b/socketIO_client/__init__.py @@ -3,7 +3,7 @@ import json import requests import time from collections import namedtuple -from urlparse import urlparse +from urllib import parse from .exceptions import ConnectionError, TimeoutError, PacketError from .transports import _get_response, _negotiate_transport, TRANSPORTS @@ -254,13 +254,13 @@ class SocketIO(object): # Initialize heartbeat_pacemaker self.heartbeat_pacemaker = self._make_heartbeat_pacemaker( heartbeat_interval=socketIO_session.heartbeat_timeout / 2) - self.heartbeat_pacemaker.next() + next(self.heartbeat_pacemaker) # Negotiate transport transport = _negotiate_transport( self.client_supported_transports, socketIO_session, self.is_secure, self.base_url, **self.kw) # Update namespaces - for path, namespace in self._namespace_by_path.iteritems(): + for path, namespace in self._namespace_by_path.items(): namespace._transport = transport transport.connect(path) return transport @@ -364,7 +364,7 @@ def find_callback(args, kw=None): def _parse_host(host, port): if not host.startswith('http'): host = 'http://' + host - url_pack = urlparse(host) + url_pack = parse.urlparse(host) is_secure = url_pack.scheme == 'https' port = port or url_pack.port or (443 if is_secure else 80) base_url = '%s:%d%s/socket.io/%s' % ( From e108c8a12a07b052de30298c967ebf077c61eba9 Mon Sep 17 00:00:00 2001 From: antonzy Date: Mon, 22 Sep 2014 17:12:08 +0300 Subject: [PATCH 5/8] Migrate to 3.4 --- socketIO_client/transports.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/socketIO_client/transports.py b/socketIO_client/transports.py index ed4e59c..5701e92 100644 --- a/socketIO_client/transports.py +++ b/socketIO_client/transports.py @@ -6,7 +6,6 @@ import six import socket import time import websocket -from itertools import izip from .exceptions import SocketIOError, ConnectionError, TimeoutError @@ -295,7 +294,7 @@ def _negotiate_transport( def _yield_text_from_framed_data(framed_data, parse=lambda x: x): parts = [parse(x) for x in framed_data.split(BOUNDARY)] - for text_length, text in izip(parts[1::2], parts[2::2]): + for text_length, text in zip(parts[1::2], parts[2::2]): if text_length != str(len(text)): warning = 'invalid declared length=%s for packet_text=%s' % ( text_length, text) From b0d67b98af947b6023605a71b24ccb8dc0298aac Mon Sep 17 00:00:00 2001 From: jorgen Date: Tue, 23 Sep 2014 06:27:27 +0200 Subject: [PATCH 6/8] Version bump --- setup.py | 2 +- socketIO_client/__init__.py | 35 ++++++++++++++++------------------- 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/setup.py b/setup.py index 76b5152..b42b4a3 100644 --- a/setup.py +++ b/setup.py @@ -9,7 +9,7 @@ CHANGES = open(os.path.join(here, 'CHANGES.rst')).read() setup( name='socketIO-client', - version='0.5.3b', + version='0.5.3.2', description='A socket.io client library', long_description=README + '\n\n' + CHANGES, license='MIT', diff --git a/socketIO_client/__init__.py b/socketIO_client/__init__.py index 3bdecf1..bd0df20 100644 --- a/socketIO_client/__init__.py +++ b/socketIO_client/__init__.py @@ -167,26 +167,23 @@ class SocketIO(object): - Omit seconds, i.e. call wait() without arguments, to wait forever. """ - try: - warning_screen = _yield_warning_screen(seconds) - for elapsed_time in warning_screen: + warning_screen = _yield_warning_screen(seconds) + for elapsed_time in warning_screen: + try: try: - try: - self._process_events() - except TimeoutError: - pass - if self._stop_waiting(for_callbacks): - break - self.heartbeat_pacemaker.send(elapsed_time) - except ConnectionError as e: - try: - warning = Exception('[connection error] %s' % e) - warning_screen.throw(warning) - except StopIteration: - _log.warn(warning) - self.disconnect() - except KeyboardInterrupt: - pass + self._process_events() + except TimeoutError: + pass + if self._stop_waiting(for_callbacks): + break + self.heartbeat_pacemaker.send(elapsed_time) + except ConnectionError as e: + try: + warning = Exception('[connection error] %s' % e) + warning_screen.throw(warning) + except StopIteration: + _log.warn(warning) + self.disconnect() def _process_events(self): for packet in self._transport.recv_packet(): From 64d1c010a923b00259318f36354cd19b97556768 Mon Sep 17 00:00:00 2001 From: Roy Hyunjin Han Date: Tue, 18 Nov 2014 10:42:57 -0500 Subject: [PATCH 7/8] Update __init__.py --- socketIO_client/__init__.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/socketIO_client/__init__.py b/socketIO_client/__init__.py index f785919..261acca 100644 --- a/socketIO_client/__init__.py +++ b/socketIO_client/__init__.py @@ -3,7 +3,10 @@ import json import requests import time from collections import namedtuple -from urllib import parse +try: + from urllib import parse as parse_url +except ImportError: + from urlparse import urlparse as parse_url from .exceptions import ConnectionError, TimeoutError, PacketError from .transports import _get_response, _negotiate_transport, TRANSPORTS @@ -364,7 +367,7 @@ def find_callback(args, kw=None): def _parse_host(host, port): if not host.startswith('http'): host = 'http://' + host - url_pack = parse.urlparse(host) + url_pack = parse_url(host) is_secure = url_pack.scheme == 'https' port = port or url_pack.port or (443 if is_secure else 80) base_url = '%s:%d%s/socket.io/%s' % ( From a0b061cbdca09fe153264163d27632e34ce9160c Mon Sep 17 00:00:00 2001 From: Roy Hyunjin Han Date: Thu, 27 Nov 2014 02:14:51 -0500 Subject: [PATCH 8/8] Use single quotes --- socketIO_client/transports.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/socketIO_client/transports.py b/socketIO_client/transports.py index d971ae2..172ca15 100644 --- a/socketIO_client/transports.py +++ b/socketIO_client/transports.py @@ -150,7 +150,7 @@ class _WebsocketTransport(_AbstractTransport): except websocket.WebSocketTimeoutException as e: raise TimeoutError(e) except websocket.SSLError as e: - if e.message == "The read operation timed out": + if 'timed out' in e.message: raise TimeoutError(e) else: raise ConnectionError(e)