Signed-off-by: YAMADA Hideki <yamada.hid...@po.ntts.co.jp>
---
 ryu/app/wsgi.py |   44 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)

diff --git a/ryu/app/wsgi.py b/ryu/app/wsgi.py
index 406fbab..6870731 100644
--- a/ryu/app/wsgi.py
+++ b/ryu/app/wsgi.py
@@ -23,6 +23,11 @@ from ryu import cfg
 from ryu.lib import hub
 from routes import Mapper
 from routes.util import URLGenerator
+from tinyrpc.server import RPCServer
+from tinyrpc.dispatch import RPCDispatcher
+from tinyrpc.dispatch import public as rpc_public
+from tinyrpc.protocols.jsonrpc import JSONRPCProtocol
+from tinyrpc.transports import ServerTransport
 
 CONF = cfg.CONF
 CONF.register_cli_opts([
@@ -115,6 +120,45 @@ class ControllerBase(object):
         return getattr(self, action)(req, **kwargs)
 
 
+class WebSocketDisconnectedError(Exception):
+    pass
+
+
+class WebSocketServerTransport(ServerTransport):
+    def __init__(self, ws):
+        self.ws = ws
+
+    def receive_message(self):
+        message = self.ws.wait()
+        if message is None:
+            raise WebSocketDisconnectedError()
+        context = None
+        return (context, message)
+
+    def send_reply(self, context, reply):
+        self.ws.send(unicode(reply))
+
+
+class WebSocketRPCServer(RPCServer):
+    def __init__(self, ws, rpc_callback):
+        dispatcher = RPCDispatcher()
+        dispatcher.register_instance(rpc_callback)
+        super(WebSocketRPCServer, self).__init__(
+            WebSocketServerTransport(ws),
+            JSONRPCProtocol(),
+            dispatcher,
+        )
+
+    def serve_forever(self):
+        try:
+            super(WebSocketRPCServer, self).serve_forever()
+        except WebSocketDisconnectedError:
+            return
+
+    def _spawn(self, func, *args, **kwargs):
+        hub.spawn(func, *args, **kwargs)
+
+
 class wsgify_hack(webob.dec.wsgify):
     def __call__(self, environ, start_response):
         self.kwargs['start_response'] = start_response
-- 
1.7.9.5


------------------------------------------------------------------------------
"Accelerate Dev Cycles with Automated Cross-Browser Testing - For FREE
Instantly run your Selenium tests across 300+ browser/OS combos.
Get unparalleled scalability from the best Selenium testing platform available
Simple to use. Nothing to install. Get started now for free."
http://p.sf.net/sfu/SauceLabs
_______________________________________________
Ryu-devel mailing list
Ryu-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to