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,25 +504,33 @@ class WebSocket(object): return headers, key + def _get_handshake_socket_io(self, host, port, resource, resp_headers, **options): + body_length = int(resp_headers['content-length']) + body = self._recv_strict(body_length) + body = body.decode('utf-8') + _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) - if traceEnabled: - logger.debug("--- request header ---") - logger.debug(header_str) - logger.debug("-----------------------") + _dump("request header", header_str) - 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) + 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) + resp_headers = self._get_resp_headers() success = self._validate_header(resp_headers, key) if not success: self.close() @@ -521,39 +538,6 @@ class WebSocket(object): 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) - - body_length = int(resp_headers['content-length']) - body = self._recv(body_length) - body = body.decode('utf-8') - - if traceEnabled: - logger.debug("--- response body ---") - logger.debug(body) - logger.debug("-----------------------") - - sessid, heartbeat, close, transports = body.split(':', 4) - transport = transports.split(',')[0] - - resource += transport + '/' + sessid - - 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("-----------------------") - - return key - def _validate_header(self, headers, key): for k, v in _HEADERS_TO_CHECK.items(): r = headers.get(k, None)