diff --git a/echo.html b/echo.html new file mode 100644 index 0000000..4c43a39 --- /dev/null +++ b/echo.html @@ -0,0 +1,47 @@ + + + WebSocket example: echo service + + +

WebSocket example: echo service

+ +
+ + + +
+ + +
+ + + +
+ + diff --git a/simple_server.py b/simple_server.py index a32af17..5a9e584 100644 --- a/simple_server.py +++ b/simple_server.py @@ -16,8 +16,15 @@ from twisted.web.static import File from twisted.internet import task -from websocket import WebSocketHandler, WebSocketSite +from websocket import WebSocketHandler, WebSocketSite, WebSocketFactory +class Echo(Protocol): + def dataReceived(self, data): + print "Received data '%s'" % data.strip() + self.transport.write(data) + +class EchoFactory(Factory): + protocol = Echo class Testhandler(WebSocketHandler): def __init__(self, transport): @@ -71,6 +78,11 @@ def connectionMade(self): root = File('.') site = WebSocketSite(root) site.addHandler('/test', Testhandler) + + # example of wrapping a factory in order to provide WebSockets transport + echo_factory_wrapped = WebSocketFactory(EchoFactory()) + site.addHandler('/echo', echo_factory_wrapped.buildHandler) + reactor.listenTCP(8080, site) # run policy file server factory = Factory() diff --git a/websocket.py b/websocket.py index 5cae1d3..14a04da 100644 --- a/websocket.py +++ b/websocket.py @@ -18,6 +18,7 @@ import struct from twisted.internet import interfaces +from twisted.protocols.policies import WrappingFactory, ProtocolWrapper from twisted.web.http import datetimeToString from twisted.web.http import _IdentityTransferDecoder from twisted.web.server import Request, Site, version, unquote @@ -483,7 +484,41 @@ def dataReceived(self, data): self._data.append(data) break +class WebSocketFactory(WrappingFactory): + """ + Factory which wraps another factory to provide WebSockets transports for + all of its protocols. + """ + + protocol = ProtocolWrapper + + def buildHandler(self, transport): + """" + Called in order to build C{WebSocketHandler} objects. + + @ivar transport: a C{WebSocketTransport} instance. + @type: L{WebSocketTransport} + """ + + protocol = self.buildProtocol(transport.getHost()) + + handler = WebSocketHandler(transport) + + def connectionMade(): + protocol.makeConnection(transport) + + def frameReceived(frame): + protocol.dataReceived(frame) + + def connectionLost(reason): + protocol.connectionLost(reason) + + handler.connectionMade = connectionMade + handler.frameReceived = frameReceived + handler.connectionLost = connectionLost + + return handler -__all__ = ["WebSocketHandler", "WebSocketSite"] +__all__ = ["WebSocketHandler", "WebSocketSite", "WebSocketFactory"]