Author: bryanduxbury
Date: Thu Apr 29 18:14:54 2010
New Revision: 939413
URL: http://svn.apache.org/viewvc?rev=939413&view=rev
Log:
THRIFT-438. py: Add support for Twisted.web in servers and clients
This patch adds a Twisted.web resource that can be used for processing incoming
Thrift requests over HTTP
Patch: Esteve Fernandez
Modified:
incubator/thrift/trunk/lib/py/src/transport/TTwisted.py
Modified: incubator/thrift/trunk/lib/py/src/transport/TTwisted.py
URL:
http://svn.apache.org/viewvc/incubator/thrift/trunk/lib/py/src/transport/TTwisted.py?rev=939413&r1=939412&r2=939413&view=diff
==============================================================================
--- incubator/thrift/trunk/lib/py/src/transport/TTwisted.py (original)
+++ incubator/thrift/trunk/lib/py/src/transport/TTwisted.py Thu Apr 29 18:14:54
2010
@@ -22,7 +22,7 @@ from twisted.internet.protocol import Pr
from twisted.internet import defer
from twisted.protocols import basic
from twisted.python import log
-
+from twisted.web import server, resource, http
from thrift.transport import TTransport
from cStringIO import StringIO
@@ -179,3 +179,41 @@ class ThriftClientFactory(ClientFactory)
self.oprot_factory)
p.factory = self
return p
+
+
+class ThriftResource(resource.Resource):
+
+ allowedMethods = ('POST',)
+
+ def __init__(self, processor, inputProtocolFactory,
+ outputProtocolFactory=None):
+ resource.Resource.__init__(self)
+ self.inputProtocolFactory = inputProtocolFactory
+ if outputProtocolFactory is None:
+ self.outputProtocolFactory = inputProtocolFactory
+ else:
+ self.outputProtocolFactory = outputProtocolFactory
+ self.processor = processor
+
+ def getChild(self, path, request):
+ return self
+
+ def _cbProcess(self, _, request, tmo):
+ msg = tmo.getvalue()
+ request.setResponseCode(http.OK)
+ request.setHeader("content-type", "application/x-thrift")
+ request.write(msg)
+ request.finish()
+
+ def render_POST(self, request):
+ request.content.seek(0, 0)
+ data = request.content.read()
+ tmi = TTransport.TMemoryBuffer(data)
+ tmo = TTransport.TMemoryBuffer()
+
+ iprot = self.inputProtocolFactory.getProtocol(tmi)
+ oprot = self.outputProtocolFactory.getProtocol(tmo)
+
+ d = self.processor.process(iprot, oprot)
+ d.addCallback(self._cbProcess, request, tmo)
+ return server.NOT_DONE_YET