Конвейерное содержимое запроса Twisted на STDIN процесса

Я хочу передать содержимое HTTP POST или PUT в STDIN процесса. Я использую библиотеку Klein и имею следующий код:

from klein import run, route
from twisted.internet import reactor, defer, protocol    
import os

class CurlProcProtocol(protocol.ProcessProtocol):
    def __init__(self, data):
        self.data = data

    def connectionMade(self):
        self.transport.write(self.data)
        self.transport.closeStdin()

    def outReceived(self, data):
        return 'got ' + str(data)

@route('/')
def home(request):
    d = defer.Deferred()

    reactor.spawnProcess(CurlProcProtocol(request.channel),
                         '/usr/bin/curl',
                         args=['curl', '-T', '-', 'ftp://localhost/test.txt'],
                         env={'HOME': os.environ['HOME']},
                         usePTY=False)

    d.addCallback(reactor.run)

    return d

run("localhost", 8080)

Проблема, с которой я борюсь, заключается в том, какую часть Request мне передать в мой CurlProcProtocol, и как затем, в свою очередь, передать ее self.transport?


person wspeirs    schedule 10.06.2016    source источник


Ответы (1)


В итоге я бросил Кляйна и ушел только с Twisted

from twisted.web import server, resource
from twisted.internet import reactor, protocol

import os


class CurlProcProtocol(protocol.ProcessProtocol):
    def __init__(self, request):
        self.request = request

    def connectionMade(self):
        self.transport.write(self.request.content.read())
        self.transport.closeStdin()

        self.request.write("Done!\n")
        self.request.finish()

    def outReceived(self, data):
        print 'GOT: ' + str(data)


class Simple(resource.Resource):
    isLeaf = True

    def render_POST(self, request):

        reactor.spawnProcess(CurlProcProtocol(request),
                             '/usr/bin/curl',
                             args=['curl', '-T', '-', 'ftp://localhost/test.txt'],
                             env={'HOME': os.environ['HOME']},
                             usePTY=False)

        return server.NOT_DONE_YET


site = server.Site(Simple(), logPath='access.log')
reactor.listenTCP(8080, site)
reactor.run()
person wspeirs    schedule 14.06.2016