2 Stimmen

Der HTTP-POST-Anfragekörper konnte mit Twisted nicht abgerufen werden

Ich habe versucht, den Körper der HTTP-POST-Anforderung mithilfe von t.p.basic.LineReceiver abzurufen, bin aber gescheitert. Mein Code ist unten aufgeführt:

from twisted.internet import reactor, protocol
from twisted.protocols import basic

class PrintPostBody(basic.LineReceiver):
    def __init__(self):
        self.line_no = 0

    def lineReceived(self, line):
        print '{0}: {1}'.format(str(self.line_no).rjust(3), repr(line))
        self.line_no += 1

    def connectionLost(self, reason):
        print "conn lost"

class PPBFactory(protocol.ServerFactory):
    protocol = PrintPostBody

def main():
    f = PPBFactory()
    reactor.listenTCP(80, f)
    reactor.run()

if __name__ == '__main__':
    main()

Als ich jedoch eine HTTP-POST-Anfrage an diesen Rechner an Port 80 stellte, wurden nur die HTTP-Anfrage-Header ausgedruckt. Beispielhafte Ausgabe:

  0: 'POST / HTTP/1.0'
  1: 'Host: ###.##.##.##'
  2: 'Referer: http://#.#####.###/?ssid=0&from=0&bd_page_type=1&uid=wiaui_1292470548_2644&pu=sz%40176_229,sz%40176_208'
  3: 'Content-Length: 116'
  4: 'Origin: http://#.#####.###'
  5: 'Content-Type: application/x-www-form-urlencoded'
  6: 'Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5'
  7: 'User-Agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US) AppleWebKit/534.11 (KHTML, like Gecko) Chrome/9.0.565.0 Safari/534.11'
  8: 'Accept-Encoding: gzip,deflate,sdch'
  9: 'Accept-Language: en-US,en;q=0.8'
 10: 'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3'
 11: 'Via: 1.1 #####.###.###.##:8080 (squid/2.6.STABLE21)'
 12: 'X-Forwarded-For: ###.##.###.###'
 13: 'Cache-Control: max-age=0'
 14: 'Connection: keep-alive'
 15: ''

Die Verbindung wurde hier also nicht geschlossen, aber der POST-Body wurde auch nicht empfangen.

Ich habe die Netzwerkbedingungen getestet, indem ich Folgendes ausgeführt habe sudo nc -l 80 und der HTTP-POST-Anforderungskörper wurde ausgedruckt.

Wie kann ich also den HTTP POST Request Body mit Twisted erhalten? Ich danke Ihnen vielmals.

7voto

Jean-Paul Calderone Punkte 46659

Ich vermute, Sie haben den Text der Anfrage nicht ausgedruckt gesehen, weil er keine Zeilenumbrüche enthielt oder mit einem Zeilenumbruch endete. Er gelangte also in den Parse-Puffer Ihrer PrintPostBody-Instanz und saß dort ewig und wartete auf einen Zeilenumbruch, der anzeigte, dass eine vollständige Zeile empfangen worden war. LineReceiver ruft den lineReceived-Callback erst dann auf, wenn eine vollständige Zeile empfangen wurde.

Stattdessen können Sie Twisted Web dieses Parsing für Sie erledigen lassen:

from twisted.web.server import Site  # Site is a server factory for HTTP
from twisted.web.resource import Resource
from twisted.internet import reactor

class PrintPostBody(Resource):  # Resources are what Site knows how to deal with
    isLeaf = True  # Disable child lookup

    def render_POST(self, request):  # Define a handler for POST requests
        print request.content.read()  # Get the request body from this file-like object
        return "" # Define the response body as empty

reactor.listenTCP(80, Site(PrintPostBody()))
reactor.run()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X