2016-06-10 19 views
0

Ich bin auf der Suche nach den Inhalt eines HTTP-POST oder PUT auf STDIN eines Prozesses zu pipe. Ich bin mit der Klein-Bibliothek und haben den folgenden Code:Pipe Twisted Request Inhalt zu STDIN des Prozesses

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) 

Das Problem, das ich mit zu kämpfen habe, ist, was Teil Request tun gebe ich in meinen CurlProcProtocol und wie wiederum kann dann übergeben es an self.transport?

Antwort

0

Ich landete Dumping Klein und gehen mit nur Verdrehte

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()