Merge branch 'smvv-master'
This commit is contained in:
@@ -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)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user