0

我正在寻找将 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传递给 my CurlProcProtocol,然后又如何将它传递给self.transport

4

1 回答 1

0

我最终抛弃了 Klein,只选择了 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()
于 2016-06-14T21:02:12.360 回答