Generischer HTTP-Server, der nur POST-Anforderungen ausgibt?

24

Ich bin auf der Suche nach einem Befehlszeilentool, das einen bestimmten Teil abhört, glücklich jede HTTP-POST-Anforderung ausschließt und sie ausgibt.

Ich möchte es zu Testzwecken verwenden, dh zum Testen von Clients, die HTTP-POST-Anforderungen ausgeben.

Das bedeutet, dass ich das Gegenstück curl -Fsuche (mit dem ich Test-HTTP-POSTs an einen HTTP-Server senden kann).

Vielleicht so etwas wie socat TCP4-LISTEN:80,fork,bind=127.0.0.1 ...- aber socat reicht nicht aus, weil es nicht über HTTP spricht.

maxschlepzig
quelle
1
Vielleicht verstehe ich die Frage nicht richtig, aber wenn Sie nur die POST-Anforderung ausgeben müssen, können Sie netcat( ncauf einigen Systemen) die Optionen -l(Listen) und -p(Portnummer) verwenden.
Peterph
1
@ Peterph, können Sie ncfür Teiltests verwenden - aber ich sehe folgende Nachteile: 1) Es sendet keinen HTTP-Statuscode 2) Ich muss Strg + D drücken, nachdem ich die Aufforderung zum Trennen der Verbindung sehe 3) Es weiß nicht wie man dann reagiert 'Expect: 100-continue' Header 4) es weiß nicht wie man mit dem 'Transfer-Encoding: chunked' Header
umgeht
Ähnliche Frage zu stackoverflow: stackoverflow.com/questions/5725430/…
maxschlepzig

Antworten:

16

Einfache Kernbefehlszeilen-Tools, wie z. B. nc, socatscheinen nicht in der Lage zu sein, bestimmte HTTP-Vorgänge (Chunks, Übertragungscodierungen usw.) zu verarbeiten. Dies kann zu unerwartetem Verhalten im Vergleich zur Kommunikation mit einem echten Webserver führen. Mein erster Gedanke ist also, den schnellsten Weg aufzuzeigen, den ich kenne, um einen winzigen Webserver einzurichten und ihn dazu zu bringen, genau das zu tun, was Sie wollen: alle Ausgaben sichern.

Der kürzeste, den ich mit Python Tornado finden konnte :

#!/usr/bin/env python

import tornado.ioloop
import tornado.web
import pprint

class MyDumpHandler(tornado.web.RequestHandler):
    def post(self):
        pprint.pprint(self.request)
        pprint.pprint(self.request.body)

if __name__ == "__main__":
    tornado.web.Application([(r"/.*", MyDumpHandler),]).listen(8080)
    tornado.ioloop.IOLoop.instance().start()

Ersetzen Sie die pprintZeile, um nur die spezifischen Felder auszugeben, die Sie beispielsweise self.request.bodyoder benötigen self.request.headers. Im obigen Beispiel wird Port 8080 an allen Schnittstellen überwacht.

Alternativen dazu gibt es genug. web.py , Flasche etc.

(Ich bin ziemlich Python-orientiert, sorry)


Wenn Ihnen die Art der Ausgabe nicht gefällt, führen Sie sie trotzdem aus und versuchen Sie es tcpdumpwie folgt:

tcpdump -i lo 'tcp[32:4] = 0x484f535420'

um einen echten Raw-Dump aller HTTP-POST-Anfragen zu sehen. Alternativ können Sie auch Wireshark ausführen.

gertvdijk
quelle
1
Für andere, die dieses sehr hilfreiche Snippet finden - es macht, was gefragt wurde -, aber wenn Sie den POST-Body sehen möchten, ist es pprint.pprint(self.request.body). Beachten Sie self.request.bodyeher als self.body. Gleiches gilt für self.request.headers. Siehe tornado.readthedocs.org/en/latest/…
mozz100
40

Ich habe auch selbst danach gesucht und bin auf den http-echo-server von Node.js gestoßen :

npm install http-echo-server -g
PORT=8081 http-echo-server

Es akzeptiert alle Anforderungen und gibt die vollständige Anforderung einschließlich des Headers an die Befehlszeile weiter.

Tobias
quelle