Added a boolean keep_running flag to WebSocketApp so that the main loop can be interrupted.

This commit is contained in:
Dariusz Suchojad
2012-02-27 12:28:52 +01:00
parent 72f03935b3
commit b4d513066c
2 changed files with 52 additions and 2 deletions

View File

@@ -222,6 +222,52 @@ class WebSocketTest(unittest.TestCase):
key = ws._create_sec_websocket_key() key = ws._create_sec_websocket_key()
u = uuid.UUID(bytes=base64.b64decode(key)) u = uuid.UUID(bytes=base64.b64decode(key))
self.assertEquals(4, u.version) self.assertEquals(4, u.version)
class WebSocketKeepRunningTest(unittest.TestCase):
class NotSetYet(object):
""" A marker class for signalling that a value hasn't been set yet.
"""
def setUp(self):
ws.enableTrace(TRACABLE)
WebSocketKeepRunningTest.keep_running_open = WebSocketKeepRunningTest.NotSetYet()
WebSocketKeepRunningTest.keep_running_close = WebSocketKeepRunningTest.NotSetYet()
def tearDown(self):
WebSocketKeepRunningTest.keep_running_open = WebSocketKeepRunningTest.NotSetYet()
WebSocketKeepRunningTest.keep_running_close = WebSocketKeepRunningTest.NotSetYet()
def testKeepRunning(self):
""" A WebSocketApp should keep running as long as its self.keep_running
is not False (in the boolean context).
"""
def on_open(self, *args, **kwargs):
""" Set the keep_running flag for later inspection and immediately
close the connection.
"""
WebSocketKeepRunningTest.keep_running_open = self.keep_running
self.close()
def on_close(self, *args, **kwargs):
""" Set the keep_running flag for the test to use.
"""
WebSocketKeepRunningTest.keep_running_close = self.keep_running
app = ws.WebSocketApp('ws://echo.websocket.org/', on_open=on_open, on_close=on_close)
app.run_forever()
self.assertFalse(isinstance(WebSocketKeepRunningTest.keep_running_open,
WebSocketKeepRunningTest.NotSetYet))
self.assertFalse(isinstance(WebSocketKeepRunningTest.keep_running_close,
WebSocketKeepRunningTest.NotSetYet))
self.assertEquals(True, WebSocketKeepRunningTest.keep_running_open)
self.assertEquals(False, WebSocketKeepRunningTest.keep_running_close)
if __name__ == "__main__": if __name__ == "__main__":

View File

@@ -639,7 +639,7 @@ class WebSocketApp(object):
""" """
def __init__(self, url, def __init__(self, url,
on_open = None, on_message = None, on_error = None, on_open = None, on_message = None, on_error = None,
on_close = None): on_close = None, keep_running = True):
""" """
url: websocket url. url: websocket url.
on_open: callable object which is called at opening websocket. on_open: callable object which is called at opening websocket.
@@ -654,6 +654,8 @@ class WebSocketApp(object):
The passing 2nd arugment is exception object. The passing 2nd arugment is exception object.
on_close: callable object which is called when closed the connection. on_close: callable object which is called when closed the connection.
this function has one argument. The arugment is this class object. this function has one argument. The arugment is this class object.
keep_running: a boolean flag indicating whether the app's main loop should
keep running, defaults to True
""" """
self.url = url self.url = url
self.on_open = on_open self.on_open = on_open
@@ -661,6 +663,7 @@ class WebSocketApp(object):
self.on_error = on_error self.on_error = on_error
self.on_close = on_close self.on_close = on_close
self.sock = None self.sock = None
self.keep_running = keep_running
def send(self, data): def send(self, data):
""" """
@@ -672,6 +675,7 @@ class WebSocketApp(object):
""" """
close websocket connection. close websocket connection.
""" """
self.keep_running = False
self.sock.close() self.sock.close()
def run_forever(self): def run_forever(self):
@@ -685,7 +689,7 @@ class WebSocketApp(object):
self.sock = WebSocket() self.sock = WebSocket()
self.sock.connect(self.url) self.sock.connect(self.url)
self._run_with_no_err(self.on_open) self._run_with_no_err(self.on_open)
while True: while self.keep_running:
data = self.sock.recv() data = self.sock.recv()
if data is None: if data is None:
break break