diff options
author | liris <liris.pp@gmail.com> | 2014-06-24 09:30:58 +0900 |
---|---|---|
committer | liris <liris.pp@gmail.com> | 2014-06-24 09:30:58 +0900 |
commit | 29bdbfe62dbf30b4deecc3e1c829a947a6468fb3 (patch) | |
tree | 82b6d12301dab934f4637b79023639840f0b94b8 | |
parent | 645bcebb7b1b9efb0509f0102ab6e59b5fc78f87 (diff) | |
download | websocket-client-29bdbfe62dbf30b4deecc3e1c829a947a6468fb3.tar.gz |
- fixed #91
- append documentation.
- refactoring.
-rw-r--r-- | README.rst | 18 | ||||
-rw-r--r-- | websocket/_core.py | 86 |
2 files changed, 53 insertions, 51 deletions
@@ -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(): |