diff options
author | liris <liris.pp@gmail.com> | 2014-06-24 08:57:16 +0900 |
---|---|---|
committer | liris <liris.pp@gmail.com> | 2014-06-24 08:57:16 +0900 |
commit | 645bcebb7b1b9efb0509f0102ab6e59b5fc78f87 (patch) | |
tree | 8efbe903f333294cc5be657e6821787545630ab2 | |
parent | 6f71e8ad630ccc1637bc413028ce2a0b64fe2c1b (diff) | |
parent | e1283cc0381790ae0c090643d4067686c9800bc3 (diff) | |
download | websocket-client-645bcebb7b1b9efb0509f0102ab6e59b5fc78f87.tar.gz |
Merge branch 'smvv-master'
-rw-r--r-- | websocket/_core.py | 58 |
1 files changed, 53 insertions, 5 deletions
diff --git a/websocket/_core.py b/websocket/_core.py index cfb0f68..a914cc3 100644 --- a/websocket/_core.py +++ b/websocket/_core.py @@ -205,8 +205,10 @@ 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) websock = WebSocket(sockopt=sockopt, sslopt=sslopt, - fire_cont_frame = fire_cont_frame, enable_multithread=enable_multithread) + fire_cont_frame = fire_cont_frame, enable_multithread=enable_multithread, + support_socket_io=support_socket_io) websock.settimeout(timeout if timeout is not None else default_timeout) websock.connect(url, **options) return websock @@ -323,7 +325,8 @@ class WebSocket(object): """ def __init__(self, get_mask_key=None, sockopt=None, sslopt=None, - fire_cont_frame=False, enable_multithread=False): + fire_cont_frame=False, enable_multithread=False, + support_socket_io=False): """ Initalize WebSocket object. """ @@ -348,6 +351,7 @@ class WebSocket(object): self.lock = threading.Lock() else: self.lock = NoLock() + self.support_socket_io = support_socket_io def fileno(self): return self.sock.fileno() @@ -458,7 +462,7 @@ class WebSocket(object): if status != 200: raise WebSocketException("failed CONNECT via proxy") - def _handshake(self, host, port, resource, **options): + def _get_handshake_headers(self, resource, host, port, options): headers = [] headers.append("GET %s HTTP/1.1" % resource) headers.append("Upgrade: websocket") @@ -480,13 +484,20 @@ class WebSocket(object): if "header" in options: headers.extend(options["header"]) + cookie = options.get("cookie", None) + if cookie: headers.append("Cookie: %s" % cookie) headers.append("") headers.append("") + 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: @@ -494,10 +505,14 @@ class WebSocket(object): 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) + raise WebSocketException("Handshake status %d" % status) success = self._validate_header(resp_headers, key) if not success: @@ -506,6 +521,39 @@ 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) @@ -561,7 +609,7 @@ class WebSocket(object): """ Send the data as string. - payload: Payload must be utf-8 string or unicoce, + payload: Payload must be utf-8 string or unicode, if the opcode is OPCODE_TEXT. Otherwise, it must be string(byte array) |