2
setup.py
2
setup.py
@@ -1,6 +1,6 @@
|
|||||||
from setuptools import setup
|
from setuptools import setup
|
||||||
|
|
||||||
VERSION = "0.9.0"
|
VERSION = "0.10.0"
|
||||||
|
|
||||||
|
|
||||||
setup(
|
setup(
|
||||||
|
@@ -4,6 +4,7 @@
|
|||||||
import base64
|
import base64
|
||||||
import uuid
|
import uuid
|
||||||
import unittest
|
import unittest
|
||||||
|
import socket
|
||||||
|
|
||||||
# websocket-client
|
# websocket-client
|
||||||
import websocket as ws
|
import websocket as ws
|
||||||
@@ -32,6 +33,7 @@ class StringSockMock:
|
|||||||
|
|
||||||
def send(self, data):
|
def send(self, data):
|
||||||
self.sent.append(data)
|
self.sent.append(data)
|
||||||
|
return len(data)
|
||||||
|
|
||||||
|
|
||||||
class HeaderSockMock(StringSockMock):
|
class HeaderSockMock(StringSockMock):
|
||||||
@@ -304,5 +306,15 @@ class WebSocketAppTest(unittest.TestCase):
|
|||||||
# Note: We can't use 'is' for comparing the functions directly, need to use 'id'.
|
# Note: We can't use 'is' for comparing the functions directly, need to use 'id'.
|
||||||
self.assertEquals(WebSocketAppTest.get_mask_key_id, id(my_mask_key_func))
|
self.assertEquals(WebSocketAppTest.get_mask_key_id, id(my_mask_key_func))
|
||||||
|
|
||||||
|
|
||||||
|
class SockOptTest(unittest.TestCase):
|
||||||
|
def testSockOpt(self):
|
||||||
|
sockopt = ((socket.IPPROTO_TCP, socket.TCP_NODELAY, 1),)
|
||||||
|
s = ws.WebSocket(sockopt = sockopt)
|
||||||
|
self.assertNotEquals(s.sock.getsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY), 0)
|
||||||
|
s = ws.create_connection("ws://echo.websocket.org", sockopt = sockopt)
|
||||||
|
self.assertNotEquals(s.sock.getsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY), 0)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
18
websocket.py
18
websocket.py
@@ -172,7 +172,8 @@ def create_connection(url, timeout=None, **options):
|
|||||||
options: current support option is only "header".
|
options: current support option is only "header".
|
||||||
if you set header as dict value, the custom HTTP headers are added.
|
if you set header as dict value, the custom HTTP headers are added.
|
||||||
"""
|
"""
|
||||||
websock = WebSocket()
|
sockopt = options.get("sockopt", ())
|
||||||
|
websock = WebSocket(sockopt=sockopt)
|
||||||
websock.settimeout(timeout != None and timeout or default_timeout)
|
websock.settimeout(timeout != None and timeout or default_timeout)
|
||||||
websock.connect(url, **options)
|
websock.connect(url, **options)
|
||||||
return websock
|
return websock
|
||||||
@@ -349,14 +350,18 @@ class WebSocket(object):
|
|||||||
|
|
||||||
get_mask_key: a callable to produce new mask keys, see the set_mask_key
|
get_mask_key: a callable to produce new mask keys, see the set_mask_key
|
||||||
function's docstring for more details
|
function's docstring for more details
|
||||||
|
sockopt: values for socket.setsockopt.
|
||||||
|
sockopt must be tuple and each element is argument of sock.setscokopt.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, get_mask_key = None):
|
def __init__(self, get_mask_key = None, sockopt = ()):
|
||||||
"""
|
"""
|
||||||
Initalize WebSocket object.
|
Initalize WebSocket object.
|
||||||
"""
|
"""
|
||||||
self.connected = False
|
self.connected = False
|
||||||
self.io_sock = self.sock = socket.socket()
|
self.io_sock = self.sock = socket.socket()
|
||||||
|
for opts in sockopt:
|
||||||
|
self.sock.setsockopt(*opts)
|
||||||
self.get_mask_key = get_mask_key
|
self.get_mask_key = get_mask_key
|
||||||
|
|
||||||
def set_mask_key(self, func):
|
def set_mask_key(self, func):
|
||||||
@@ -687,7 +692,8 @@ class WebSocketApp(object):
|
|||||||
"""
|
"""
|
||||||
def __init__(self, url, header = [],
|
def __init__(self, url, header = [],
|
||||||
on_open = None, on_message = None, on_error = None,
|
on_open = None, on_message = None, on_error = None,
|
||||||
on_close = None, keep_running = True, get_mask_key = None):
|
on_close = None, keep_running = True, get_mask_key = None,
|
||||||
|
sockopt=()):
|
||||||
"""
|
"""
|
||||||
url: websocket url.
|
url: websocket url.
|
||||||
header: custom header for websocket handshake.
|
header: custom header for websocket handshake.
|
||||||
@@ -734,15 +740,17 @@ class WebSocketApp(object):
|
|||||||
self.keep_running = False
|
self.keep_running = False
|
||||||
self.sock.close()
|
self.sock.close()
|
||||||
|
|
||||||
def run_forever(self):
|
def run_forever(self, sockopt=()):
|
||||||
"""
|
"""
|
||||||
run event loop for WebSocket framework.
|
run event loop for WebSocket framework.
|
||||||
This loop is infinite loop and is alive during websocket is available.
|
This loop is infinite loop and is alive during websocket is available.
|
||||||
|
sockopt: values for socket.setsockopt.
|
||||||
|
sockopt must be tuple and each element is argument of sock.setscokopt.
|
||||||
"""
|
"""
|
||||||
if self.sock:
|
if self.sock:
|
||||||
raise WebSocketException("socket is already opened")
|
raise WebSocketException("socket is already opened")
|
||||||
try:
|
try:
|
||||||
self.sock = WebSocket(self.get_mask_key)
|
self.sock = WebSocket(self.get_mask_key, sockopt = sockopt)
|
||||||
self.sock.connect(self.url, header = self.header)
|
self.sock.connect(self.url, header = self.header)
|
||||||
self._run_with_no_err(self.on_open)
|
self._run_with_no_err(self.on_open)
|
||||||
while self.keep_running:
|
while self.keep_running:
|
||||||
|
Reference in New Issue
Block a user