Serveur HTTP générique qui vide simplement les requêtes POST?

24

Je suis à la recherche d'un outil en ligne de commande qui écoute une partie donnée, exclut heureusement chaque requête HTTP POST et la vide.

Je veux l'utiliser à des fins de test, c'est-à-dire pour tester des clients qui émettent des requêtes HTTP POST.

Cela signifie que je recherche l'homologue curl -F(que je peux utiliser pour envoyer des tests HTTP POST à ​​un serveur HTTP).

Peut-être quelque chose comme socat TCP4-LISTEN:80,fork,bind=127.0.0.1 ...- mais socat ne suffit pas car il ne parle pas HTTP.

maxschlepzig
la source
1
Peut-être que je ne comprends pas la question correctement, mais si tout ce dont vous avez besoin est de vider la requête POST, vous pouvez utiliser netcat( ncsur certains systèmes) avec les options -l(écouter) et -p(numéro de port).
peterph
1
@peterph, vous pouvez utiliser ncpour des tests partiels - mais je peux voir les inconvénients suivants: 1) il n'envoie pas de code d'état HTTP 2) je dois appuyer sur Ctrl + D après avoir vu la demande de fermeture de la connexion 3) il ne sait pas comment réagir lors de l'en-tête 'Expect: 100-continue' 4) il ne sait pas comment gérer l'en-tête 'Transfer-Encoding: chunked' - il n'affiche probablement que le premier (probablement) bloc vide
maxschlepzig
Question similaire sur stackoverflow: stackoverflow.com/questions/5725430/…
maxschlepzig

Réponses:

16

Les outils de ligne de commande simples comme nc, socatsemblent ne pas être en mesure de gérer les choses HTTP spécifiques en cours (morceaux, encodages de transfert, etc.). Par conséquent, cela peut produire un comportement inattendu par rapport à une conversation avec un vrai serveur Web. Donc, ma première pensée est de partager la façon la plus rapide que je connaisse de configurer un petit serveur Web et de le faire faire ce que vous voulez: vider toutes les sorties.

Le plus court que j'ai pu trouver avec Python Tornado :

#!/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()

Remplacez la pprintligne pour afficher uniquement les champs spécifiques dont vous avez besoin, par exemple self.request.bodyou self.request.headers. Dans l'exemple ci-dessus, il écoute sur le port 8080, sur toutes les interfaces.

Les alternatives à cela sont nombreuses. web.py , bouteille , etc.

(Je suis plutôt orienté Python, désolé)


Si vous n'aimez pas sa façon de produire, lancez-le quand même et essayez tcpdumpcomme ceci:

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

pour voir un vrai vidage brut de toutes les requêtes HTTP-POST. Sinon, exécutez simplement Wireshark.

gertvdijk
la source
1
Pour ceux qui trouvent cet extrait très utile - il fait ce qui a été demandé - mais si vous voulez voir le corps du POST, il l'est pprint.pprint(self.request.body). Notez self.request.bodyplutôt que self.body. Pareil pour self.request.headers. Voir tornado.readthedocs.org/en/latest/…
mozz100
40

Je le cherchais moi aussi et je suis tombé sur le serveur http-echo de Node.js :

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

Il accepte toutes les demandes et renvoie la demande complète, y compris l'en-tête à la ligne de commande.

Tobias
la source