- Passing socketopt parameter to Websocket ctor.
This commit is contained in:
liris
2013-03-04 09:37:42 +09:00
parent 4a4b50ab23
commit 502c80be05
3 changed files with 26 additions and 6 deletions

View File

@@ -1,6 +1,6 @@
from setuptools import setup
VERSION = "0.9.0"
VERSION = "0.10.0"
setup(

View File

@@ -4,6 +4,7 @@
import base64
import uuid
import unittest
import socket
# websocket-client
import websocket as ws
@@ -32,6 +33,7 @@ class StringSockMock:
def send(self, data):
self.sent.append(data)
return len(data)
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'.
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__":
unittest.main()

View File

@@ -172,7 +172,8 @@ def create_connection(url, timeout=None, **options):
options: current support option is only "header".
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.connect(url, **options)
return websock
@@ -349,14 +350,18 @@ class WebSocket(object):
get_mask_key: a callable to produce new mask keys, see the set_mask_key
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.
"""
self.connected = False
self.io_sock = self.sock = socket.socket()
for opts in sockopt:
self.sock.setsockopt(*opts)
self.get_mask_key = get_mask_key
def set_mask_key(self, func):
@@ -687,7 +692,8 @@ class WebSocketApp(object):
"""
def __init__(self, url, header = [],
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.
header: custom header for websocket handshake.
@@ -734,15 +740,17 @@ class WebSocketApp(object):
self.keep_running = False
self.sock.close()
def run_forever(self):
def run_forever(self, sockopt=()):
"""
run event loop for WebSocket framework.
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:
raise WebSocketException("socket is already opened")
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._run_with_no_err(self.on_open)
while self.keep_running: