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"]