Replaced secure=True with host='https://example.com'
This commit is contained in:
parent
a60e19fb54
commit
e7529e5487
7 changed files with 57 additions and 36 deletions
|
|
@ -1,3 +1,8 @@
|
||||||
|
0.5.2
|
||||||
|
-----
|
||||||
|
- Replaced secure=True with host='https://example.com'
|
||||||
|
- Fixed sending heartbeats thanks to Travis Odom
|
||||||
|
|
||||||
0.5.1
|
0.5.1
|
||||||
-----
|
-----
|
||||||
- Added error handling in the event of websocket timeout
|
- Added error handling in the event of websocket timeout
|
||||||
|
|
|
||||||
11
README.rst
11
README.rst
|
|
@ -110,15 +110,13 @@ Define different namespaces on a single socket. ::
|
||||||
news_namespace.emit('aaa')
|
news_namespace.emit('aaa')
|
||||||
socketIO.wait(seconds=1)
|
socketIO.wait(seconds=1)
|
||||||
|
|
||||||
Open secure websockets (HTTPS / WSS) behind a proxy. ::
|
Connect via SSL. ::
|
||||||
|
|
||||||
from socketIO_client import SocketIO
|
from socketIO_client import SocketIO
|
||||||
|
|
||||||
SocketIO('localhost', 8000,
|
SocketIO('https://localhost')
|
||||||
secure=True,
|
|
||||||
proxies={'https': 'https://proxy.example.com:8080'})
|
|
||||||
|
|
||||||
Specify params, headers and cookies thanks to the `requests`_ library. ::
|
Specify params, headers, cookies, proxies thanks to the `requests`_ library. ::
|
||||||
|
|
||||||
from socketIO_client import SocketIO
|
from socketIO_client import SocketIO
|
||||||
from base64 import b64encode
|
from base64 import b64encode
|
||||||
|
|
@ -126,7 +124,8 @@ Specify params, headers and cookies thanks to the `requests`_ library. ::
|
||||||
SocketIO('localhost', 8000,
|
SocketIO('localhost', 8000,
|
||||||
params={'q': 'qqq'},
|
params={'q': 'qqq'},
|
||||||
headers={'Authorization': 'Basic ' + b64encode('username:password')},
|
headers={'Authorization': 'Basic ' + b64encode('username:password')},
|
||||||
cookies={'a': 'aaa'})
|
cookies={'a': 'aaa'},
|
||||||
|
proxies={'https': 'https://proxy.example.com:8080'})
|
||||||
|
|
||||||
|
|
||||||
License
|
License
|
||||||
|
|
|
||||||
|
|
@ -1,2 +1 @@
|
||||||
# America/Los_Angeles 11/3/2013
|
# America/Los_Angeles 11/17/2013
|
||||||
Add test for server ack callback in namespace
|
|
||||||
4
TODO.log
Normal file
4
TODO.log
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
# UTC 11/17/2013
|
||||||
|
+ Beware of scheme included in URL [11/17/2013]
|
||||||
|
+ Add test for server ack callback in namespace [11/17/2013]
|
||||||
|
+ Set port automatically if it is not automatically specified [11/17/2013]
|
||||||
2
setup.py
2
setup.py
|
|
@ -9,7 +9,7 @@ CHANGES = open(os.path.join(here, 'CHANGES.rst')).read()
|
||||||
|
|
||||||
setup(
|
setup(
|
||||||
name='socketIO-client',
|
name='socketIO-client',
|
||||||
version='0.5.1',
|
version='0.5.2',
|
||||||
description='A socket.io client library',
|
description='A socket.io client library',
|
||||||
long_description=README + '\n\n' + CHANGES,
|
long_description=README + '\n\n' + CHANGES,
|
||||||
license='MIT',
|
license='MIT',
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ import json
|
||||||
import requests
|
import requests
|
||||||
import time
|
import time
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
from urlparse import urlparse
|
||||||
|
|
||||||
from .exceptions import ConnectionError, TimeoutError, PacketError
|
from .exceptions import ConnectionError, TimeoutError, PacketError
|
||||||
from .transports import _get_response, _negotiate_transport, TRANSPORTS
|
from .transports import _get_response, _negotiate_transport, TRANSPORTS
|
||||||
|
|
@ -105,24 +106,26 @@ class BaseNamespace(object):
|
||||||
|
|
||||||
|
|
||||||
class SocketIO(object):
|
class SocketIO(object):
|
||||||
|
"""Create a socket.io client that connects to a socket.io server
|
||||||
|
at the specified host and port.
|
||||||
|
|
||||||
|
- Define the behavior of the client by specifying a custom Namespace.
|
||||||
|
- Prefix host with https:// to use SSL.
|
||||||
|
- Set wait_for_connection=True to block until we have a connection.
|
||||||
|
- Specify the transports you want to use.
|
||||||
|
- Pass query params, headers, cookies, proxies as keyword arguments.
|
||||||
|
|
||||||
|
SocketIO('localhost', 8000,
|
||||||
|
params={'q': 'qqq'},
|
||||||
|
headers={'Authorization': 'Basic ' + b64encode('username:password')},
|
||||||
|
cookies={'a': 'aaa'},
|
||||||
|
proxies={'https': 'https://proxy.example.com:8080'})
|
||||||
|
"""
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self, host, port, Namespace=BaseNamespace, secure=False,
|
self, host, port=None, Namespace=BaseNamespace,
|
||||||
wait_for_connection=True, transports=TRANSPORTS, **kw):
|
wait_for_connection=True, transports=TRANSPORTS, **kw):
|
||||||
"""
|
self.is_secure, self.base_url = _parse_host(host, port)
|
||||||
Create a socket.io client that connects to a socket.io server
|
|
||||||
at the specified host and port.
|
|
||||||
- Define the behavior of the client by specifying a custom Namespace.
|
|
||||||
- Set secure=True to use HTTPS / WSS.
|
|
||||||
- Set wait_for_connection=True to block until we have a connection.
|
|
||||||
- List the transports you want to use (%s).
|
|
||||||
- Pass query params, headers, cookies, proxies as keyword arguments.
|
|
||||||
|
|
||||||
SocketIO('localhost', 8000, proxies={
|
|
||||||
'https': 'https://proxy.example.com:8080'})
|
|
||||||
""" % ', '.join(TRANSPORTS)
|
|
||||||
self.base_url = '%s:%d/socket.io/%s' % (host, port, PROTOCOL_VERSION)
|
|
||||||
self.secure = secure
|
|
||||||
self.wait_for_connection = wait_for_connection
|
self.wait_for_connection = wait_for_connection
|
||||||
self._namespace_by_path = {}
|
self._namespace_by_path = {}
|
||||||
self.client_supported_transports = transports
|
self.client_supported_transports = transports
|
||||||
|
|
@ -222,7 +225,7 @@ class SocketIO(object):
|
||||||
|
|
||||||
def _get_transport(self):
|
def _get_transport(self):
|
||||||
socketIO_session = _get_socketIO_session(
|
socketIO_session = _get_socketIO_session(
|
||||||
self.secure, self.base_url, **self.kw)
|
self.is_secure, self.base_url, **self.kw)
|
||||||
_log.debug('[transports available] %s', ' '.join(
|
_log.debug('[transports available] %s', ' '.join(
|
||||||
socketIO_session.server_supported_transports))
|
socketIO_session.server_supported_transports))
|
||||||
# Initialize heartbeat_pacemaker
|
# Initialize heartbeat_pacemaker
|
||||||
|
|
@ -232,7 +235,7 @@ class SocketIO(object):
|
||||||
# Negotiate transport
|
# Negotiate transport
|
||||||
transport = _negotiate_transport(
|
transport = _negotiate_transport(
|
||||||
self.client_supported_transports, socketIO_session,
|
self.client_supported_transports, socketIO_session,
|
||||||
self.secure, self.base_url, **self.kw)
|
self.is_secure, self.base_url, **self.kw)
|
||||||
# Update namespaces
|
# Update namespaces
|
||||||
for namespace in self._namespace_by_path.values():
|
for namespace in self._namespace_by_path.values():
|
||||||
namespace._transport = transport
|
namespace._transport = transport
|
||||||
|
|
@ -340,6 +343,17 @@ def find_callback(args, kw=None):
|
||||||
return None, args
|
return None, args
|
||||||
|
|
||||||
|
|
||||||
|
def _parse_host(host, port):
|
||||||
|
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)
|
||||||
|
return is_secure, base_url
|
||||||
|
|
||||||
|
|
||||||
def _yield_warning_screen(seconds=None):
|
def _yield_warning_screen(seconds=None):
|
||||||
last_warning = None
|
last_warning = None
|
||||||
for elapsed_time in _yield_elapsed_time(seconds):
|
for elapsed_time in _yield_elapsed_time(seconds):
|
||||||
|
|
@ -362,8 +376,8 @@ def _yield_elapsed_time(seconds=None):
|
||||||
yield time.time() - start_time
|
yield time.time() - start_time
|
||||||
|
|
||||||
|
|
||||||
def _get_socketIO_session(secure, base_url, **kw):
|
def _get_socketIO_session(is_secure, base_url, **kw):
|
||||||
server_url = '%s://%s/' % ('https' if secure else 'http', base_url)
|
server_url = '%s://%s/' % ('https' if is_secure else 'http', base_url)
|
||||||
try:
|
try:
|
||||||
response = _get_response(requests.get, server_url, **kw)
|
response = _get_response(requests.get, server_url, **kw)
|
||||||
except TimeoutError as e:
|
except TimeoutError as e:
|
||||||
|
|
|
||||||
|
|
@ -104,10 +104,10 @@ class _AbstractTransport(object):
|
||||||
|
|
||||||
class _WebsocketTransport(_AbstractTransport):
|
class _WebsocketTransport(_AbstractTransport):
|
||||||
|
|
||||||
def __init__(self, socketIO_session, secure, base_url, **kw):
|
def __init__(self, socketIO_session, is_secure, base_url, **kw):
|
||||||
super(_WebsocketTransport, self).__init__()
|
super(_WebsocketTransport, self).__init__()
|
||||||
url = '%s://%s/websocket/%s' % (
|
url = '%s://%s/websocket/%s' % (
|
||||||
'wss' if secure else 'ws',
|
'wss' if is_secure else 'ws',
|
||||||
base_url, socketIO_session.id)
|
base_url, socketIO_session.id)
|
||||||
try:
|
try:
|
||||||
self._connection = websocket.create_connection(url)
|
self._connection = websocket.create_connection(url)
|
||||||
|
|
@ -151,10 +151,10 @@ class _WebsocketTransport(_AbstractTransport):
|
||||||
|
|
||||||
class _XHR_PollingTransport(_AbstractTransport):
|
class _XHR_PollingTransport(_AbstractTransport):
|
||||||
|
|
||||||
def __init__(self, socketIO_session, secure, base_url, **kw):
|
def __init__(self, socketIO_session, is_secure, base_url, **kw):
|
||||||
super(_XHR_PollingTransport, self).__init__()
|
super(_XHR_PollingTransport, self).__init__()
|
||||||
self._url = '%s://%s/xhr-polling/%s' % (
|
self._url = '%s://%s/xhr-polling/%s' % (
|
||||||
'https' if secure else 'http',
|
'https' if is_secure else 'http',
|
||||||
base_url, socketIO_session.id)
|
base_url, socketIO_session.id)
|
||||||
self._connected = True
|
self._connected = True
|
||||||
self._http_session = _prepare_http_session(kw)
|
self._http_session = _prepare_http_session(kw)
|
||||||
|
|
@ -203,10 +203,10 @@ class _JSONP_PollingTransport(_AbstractTransport):
|
||||||
|
|
||||||
RESPONSE_PATTERN = re.compile(r'io.j\[(\d+)\]\("(.*)"\);')
|
RESPONSE_PATTERN = re.compile(r'io.j\[(\d+)\]\("(.*)"\);')
|
||||||
|
|
||||||
def __init__(self, socketIO_session, secure, base_url, **kw):
|
def __init__(self, socketIO_session, is_secure, base_url, **kw):
|
||||||
super(_JSONP_PollingTransport, self).__init__()
|
super(_JSONP_PollingTransport, self).__init__()
|
||||||
self._url = '%s://%s/jsonp-polling/%s' % (
|
self._url = '%s://%s/jsonp-polling/%s' % (
|
||||||
'https' if secure else 'http',
|
'https' if is_secure else 'http',
|
||||||
base_url, socketIO_session.id)
|
base_url, socketIO_session.id)
|
||||||
self._connected = True
|
self._connected = True
|
||||||
self._http_session = _prepare_http_session(kw)
|
self._http_session = _prepare_http_session(kw)
|
||||||
|
|
@ -264,7 +264,7 @@ class _JSONP_PollingTransport(_AbstractTransport):
|
||||||
|
|
||||||
def _negotiate_transport(
|
def _negotiate_transport(
|
||||||
client_supported_transports, session,
|
client_supported_transports, session,
|
||||||
secure, base_url, **kw):
|
is_secure, base_url, **kw):
|
||||||
server_supported_transports = session.server_supported_transports
|
server_supported_transports = session.server_supported_transports
|
||||||
for supported_transport in client_supported_transports:
|
for supported_transport in client_supported_transports:
|
||||||
if supported_transport in server_supported_transports:
|
if supported_transport in server_supported_transports:
|
||||||
|
|
@ -273,7 +273,7 @@ def _negotiate_transport(
|
||||||
'websocket': _WebsocketTransport,
|
'websocket': _WebsocketTransport,
|
||||||
'xhr-polling': _XHR_PollingTransport,
|
'xhr-polling': _XHR_PollingTransport,
|
||||||
'jsonp-polling': _JSONP_PollingTransport,
|
'jsonp-polling': _JSONP_PollingTransport,
|
||||||
}[supported_transport](session, secure, base_url, **kw)
|
}[supported_transport](session, is_secure, base_url, **kw)
|
||||||
raise SocketIOError(' '.join([
|
raise SocketIOError(' '.join([
|
||||||
'could not negotiate a transport:',
|
'could not negotiate a transport:',
|
||||||
'client supports %s but' % ', '.join(client_supported_transports),
|
'client supports %s but' % ', '.join(client_supported_transports),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue