Merge branch 'smvv-master'

This commit is contained in:
liris
2014-06-24 08:57:16 +09:00

View File

@@ -205,8 +205,10 @@ def create_connection(url, timeout=None, **options):
sslopt = options.get("sslopt", {}) sslopt = options.get("sslopt", {})
fire_cont_frame = options.get("fire_cont_frame", False) fire_cont_frame = options.get("fire_cont_frame", False)
enable_multithread = options.get("enable_multithread", False) enable_multithread = options.get("enable_multithread", False)
support_socket_io = options.get("support_socket_io", False)
websock = WebSocket(sockopt=sockopt, sslopt=sslopt, 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.settimeout(timeout if timeout is not None else default_timeout)
websock.connect(url, **options) websock.connect(url, **options)
return websock return websock
@@ -323,7 +325,8 @@ class WebSocket(object):
""" """
def __init__(self, get_mask_key=None, sockopt=None, sslopt=None, 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. Initalize WebSocket object.
""" """
@@ -348,6 +351,7 @@ class WebSocket(object):
self.lock = threading.Lock() self.lock = threading.Lock()
else: else:
self.lock = NoLock() self.lock = NoLock()
self.support_socket_io = support_socket_io
def fileno(self): def fileno(self):
return self.sock.fileno() return self.sock.fileno()
@@ -458,7 +462,7 @@ class WebSocket(object):
if status != 200: if status != 200:
raise WebSocketException("failed CONNECT via proxy") raise WebSocketException("failed CONNECT via proxy")
def _handshake(self, host, port, resource, **options): def _get_handshake_headers(self, resource, host, port, options):
headers = [] headers = []
headers.append("GET %s HTTP/1.1" % resource) headers.append("GET %s HTTP/1.1" % resource)
headers.append("Upgrade: websocket") headers.append("Upgrade: websocket")
@@ -480,13 +484,20 @@ class WebSocket(object):
if "header" in options: if "header" in options:
headers.extend(options["header"]) headers.extend(options["header"])
cookie = options.get("cookie", None) cookie = options.get("cookie", None)
if cookie: if cookie:
headers.append("Cookie: %s" % cookie) headers.append("Cookie: %s" % cookie)
headers.append("") headers.append("")
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) header_str = "\r\n".join(headers)
self._send(header_str) self._send(header_str)
if traceEnabled: if traceEnabled:
@@ -494,10 +505,14 @@ class WebSocket(object):
logger.debug(header_str) logger.debug(header_str)
logger.debug("-----------------------") logger.debug("-----------------------")
if self.support_socket_io:
key = self._handshake_socket_io(host, port, resource, **options)
status, resp_headers = self._read_headers() status, resp_headers = self._read_headers()
if status != 101: if status != 101:
self.close() self.close()
raise WebSocketException("Handshake Status %d" % status) raise WebSocketException("Handshake status %d" % status)
success = self._validate_header(resp_headers, key) success = self._validate_header(resp_headers, key)
if not success: if not success:
@@ -506,6 +521,39 @@ class WebSocket(object):
self.connected = True 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): def _validate_header(self, headers, key):
for k, v in _HEADERS_TO_CHECK.items(): for k, v in _HEADERS_TO_CHECK.items():
r = headers.get(k, None) r = headers.get(k, None)
@@ -561,7 +609,7 @@ class WebSocket(object):
""" """
Send the data as string. 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. if the opcode is OPCODE_TEXT.
Otherwise, it must be string(byte array) Otherwise, it must be string(byte array)