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.


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.


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.