summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBryan Duxbury <bryanduxbury@apache.org>2010-04-29 18:14:54 +0000
committerBryan Duxbury <bryanduxbury@apache.org>2010-04-29 18:14:54 +0000
commitcb6d9708e2673b92aec3ee6bbff7e67b5b0a171f (patch)
treef5249c2a1acce487a4d5d27b2e870f3f3a6582c5
parent332a625118c87d1ea3540aefff3f5ad8ddf8428b (diff)
downloadthrift-cb6d9708e2673b92aec3ee6bbff7e67b5b0a171f.tar.gz
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 git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@939413 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--lib/py/src/transport/TTwisted.py40
1 files changed, 39 insertions, 1 deletions
diff --git a/lib/py/src/transport/TTwisted.py b/lib/py/src/transport/TTwisted.py
index a1ba1502d..b6dcb4e0b 100644
--- a/lib/py/src/transport/TTwisted.py
+++ b/lib/py/src/transport/TTwisted.py
@@ -22,7 +22,7 @@ from twisted.internet.protocol import Protocol, ServerFactory, ClientFactory, \
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