[Twisted-Python] Transplating a request's transport (SockJS)
Phil Mayers
p.mayers at imperial.ac.uk
Tue Oct 30 05:04:02 EDT 2012
On 10/30/2012 06:50 AM, Laurens Van Houtven wrote:
> On Mon, Oct 29, 2012 at 4:02 PM, <exarkun at twistedmatrix.com
> <mailto:exarkun at twistedmatrix.com>> wrote:
>
> In case anyone didn't read #3204: this is, of course, an unsupported use
> of transports and not guaranteed to work or continue working (currently
> it will not work if you happen to be using the (preferred) protocol-
> based SSL implementation).
>
>
> So, is there a non-terrible way of doing "feed the raw HTTP bytes that
> caused this request to this factory instead", in an IResource?
Would it not make more sense to subclass Site and swap out the Channel
implementation for one that can be "pointed" somewhere else? It means
you have to use that "Site" for any WebSocket enabled site, but it would
be clean otherwise. Like so:
class WebSockCapableChannel(http.HTTPChannel):
def __init__(self):
http.HTTPChannel.__init__(self)
self.websocket = False
def startWebSocket(self, proto):
self.websocket = True
self.websocket_proto = proto
proto.transport = someWrapper(self)
proto.connectionMade(...)
self.setRawMode()
def rawDataReceived(self, data):
if self.websocket:
self.websocket_proto.dataReceived(data)
else:
http.HTTPChannel.rawDataReceived(self, data)
class WebSocketSite(server.Site):
procol = WebSockCapableChannel
...then in your "Resource" do:
class MyResource(...):
def render(...):
request.channel.startWebSocket(someProto())
More information about the Twisted-Python
mailing list