import sys
from twisted.python import log
from twisted.internet import reactor
from twisted.web import server, resource, http

# import your Thrift interfaces, handler, etc.

class ThriftResource(resource.Resource):

    allowedMethods = ('POST',)

    def __init__(self, inputProtocolFactory, outputProtocolFactory,
        processor):
        resource.Resource.__init__(self)
        self.inputProtocolFactory = inputProtocolFactory
        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 = TMemoryBuffer(data)
        tmo = 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

def main():
    log.startLogging(sys.stdout)

    # Initialize your input/output protocol factories, handler and processor
    #
    # inputProtocolFactory = ...
    # outputProtocolFactory = ...
    # processor = ...

    thriftResource = ThriftResource(inputProtocolFactory,
        inputProtocolFactory, processor)

    reactor.listenTCP(8889, server.Site(
        resource = thriftResource))
    reactor.run()

if __name__ == '__main__':
    main()
