summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorliris <liris.pp@gmail.com>2014-06-24 09:30:58 +0900
committerliris <liris.pp@gmail.com>2014-06-24 09:30:58 +0900
commit29bdbfe62dbf30b4deecc3e1c829a947a6468fb3 (patch)
tree82b6d12301dab934f4637b79023639840f0b94b8
parent645bcebb7b1b9efb0509f0102ab6e59b5fc78f87 (diff)
downloadwebsocket-client-29bdbfe62dbf30b4deecc3e1c829a947a6468fb3.tar.gz
- fixed #91
- append documentation. - refactoring.
-rw-r--r--README.rst18
-rw-r--r--websocket/_core.py86
2 files changed, 53 insertions, 51 deletions
diff --git a/README.rst b/README.rst
index 1c56326..5919227 100644
--- a/README.rst
+++ b/README.rst
@@ -44,6 +44,21 @@ Default squid setting is "ALLOWED TO CONNECT ONLY HTTPS PORT".
Current implementation of websocket-client is using "CONNECT" method via proxy.
+Socket IO support
+==================
+
+We have experimental support for socket io 0.9, not 1.0 since websocket client v0.16.0.
+This implementation is experimetal and API migth be changed.
+
+expamle::
+-------------
+
+ import websocket
+ ws = websocket.WebSocket(support_socket_io="0.9")
+ :
+
+
+
Example
=============
@@ -143,6 +158,9 @@ example::
ChangeLog
============
+- v0.16.0
+ - experimental support for socket io 0.9 (#91)
+
- v0.15.0
- fixed exception when send a large message (#84)
diff --git a/websocket/_core.py b/websocket/_core.py
index a914cc3..29e53a2 100644
--- a/websocket/_core.py
+++ b/websocket/_core.py
@@ -115,6 +115,11 @@ def enableTrace(tracable):
logger.addHandler(logging.StreamHandler())
logger.setLevel(logging.DEBUG)
+def _dump(title, message):
+ if traceEnabled:
+ logger.debug("--- " + title + " ---")
+ logger.debug(message)
+ logger.debug("-----------------------")
def setdefaulttimeout(timeout):
"""
@@ -205,7 +210,7 @@ def create_connection(url, timeout=None, **options):
sslopt = options.get("sslopt", {})
fire_cont_frame = options.get("fire_cont_frame", False)
enable_multithread = options.get("enable_multithread", False)
- support_socket_io = options.get("support_socket_io", False)
+ support_socket_io = options.get("support_socket_io", None)
websock = WebSocket(sockopt=sockopt, sslopt=sslopt,
fire_cont_frame = fire_cont_frame, enable_multithread=enable_multithread,
support_socket_io=support_socket_io)
@@ -326,7 +331,7 @@ class WebSocket(object):
def __init__(self, get_mask_key=None, sockopt=None, sslopt=None,
fire_cont_frame=False, enable_multithread=False,
- support_socket_io=False):
+ support_socket_io=None):
"""
Initalize WebSocket object.
"""
@@ -451,10 +456,7 @@ class WebSocket(object):
logger.debug("Connecting proxy...")
connect_header = "CONNECT %s:%d HTTP/1.0\r\n" % (host, port)
connect_header += "\r\n"
- if traceEnabled:
- logger.debug("--- request header ---")
- logger.debug(connect_header)
- logger.debug("-----------------------")
+ _dump("request header", connect_header)
self._send(connect_header)
@@ -462,6 +464,13 @@ class WebSocket(object):
if status != 200:
raise WebSocketException("failed CONNECT via proxy")
+ def _get_resp_headers(self, success_status = 101):
+ status, resp_headers = self._read_headers()
+ if status != success_status:
+ self.close()
+ raise WebSocketException("Handshake status %d" % status)
+ return resp_headers
+
def _get_handshake_headers(self, resource, host, port, options):
headers = []
headers.append("GET %s HTTP/1.1" % resource)
@@ -495,64 +504,39 @@ class WebSocket(object):
return headers, key
- def _handshake(self, host, port, resource, **options):
- headers, key = self._get_handshake_headers(resource, host, port, options)
-
- header_str = "\r\n".join(headers)
- self._send(header_str)
- if traceEnabled:
- logger.debug("--- request header ---")
- logger.debug(header_str)
- logger.debug("-----------------------")
-
- if self.support_socket_io:
- key = self._handshake_socket_io(host, port, resource, **options)
-
- status, resp_headers = self._read_headers()
-
- if status != 101:
- self.close()
- raise WebSocketException("Handshake status %d" % status)
-
- success = self._validate_header(resp_headers, key)
- if not success:
- self.close()
- raise WebSocketException("Invalid WebSocket Header")
-
- self.connected = True
-
- def _handshake_socket_io(self, host, port, resource, **options):
- status, resp_headers = self._read_headers()
-
- if status != 200:
- self.close()
- raise WebSocketException("Handshake status %d" % status)
-
+ def _get_handshake_socket_io(self, host, port, resource, resp_headers, **options):
body_length = int(resp_headers['content-length'])
- body = self._recv(body_length)
+ body = self._recv_strict(body_length)
body = body.decode('utf-8')
-
- if traceEnabled:
- logger.debug("--- response body ---")
- logger.debug(body)
- logger.debug("-----------------------")
+ _dump("response body", body)
sessid, heartbeat, close, transports = body.split(':', 4)
transport = transports.split(',')[0]
-
resource += transport + '/' + sessid
+ return self._get_handshake_headers(resource, host, port, options)
+
+ def _handshake(self, host, port, resource, **options):
headers, key = self._get_handshake_headers(resource, host, port, options)
header_str = "\r\n".join(headers)
self._send(header_str)
+ _dump("request header", header_str)
- if traceEnabled:
- logger.debug("--- request header ---")
- logger.debug(header_str)
- logger.debug("-----------------------")
+ if self.support_socket_io == "0.9":
+ resp_headers = self._get_resp_headers(200)
+ headers, key = self._get_handshake_socket_io(host, port, resource, resp_headers, **options)
+ header_str = "\r\n".join(headers)
+ self._send(header_str)
+ _dump("request header", header_str)
- return key
+ resp_headers = self._get_resp_headers()
+ success = self._validate_header(resp_headers, key)
+ if not success:
+ self.close()
+ raise WebSocketException("Invalid WebSocket Header")
+
+ self.connected = True
def _validate_header(self, headers, key):
for k, v in _HEADERS_TO_CHECK.items():