Server HTTP generico che scarica le richieste POST?


24

Sto cercando uno strumento da riga di comando che ascolta una determinata parte, esclude felicemente ogni richiesta POST HTTP e la scarica.

Voglio usarlo a scopo di test, cioè per testare i client che emettono richieste POST HTTP.

Ciò significa che sto cercando la controparte curl -F(che posso usare per inviare test POST HTTP a un server HTTP).

Forse qualcosa del genere socat TCP4-LISTEN:80,fork,bind=127.0.0.1 ...- ma socat non è abbastanza perché non parla HTTP.


1
Forse non capisco correttamente la domanda, ma se tutto ciò di cui hai bisogno è scaricare la richiesta POST, puoi usare netcat( ncsu alcuni sistemi) con le opzioni -l(ascolta) e -p(numero porta).
peterph

1
@peterph, puoi usarlo ncper test parziali - ma posso vedere i seguenti svantaggi: 1) non invia il codice di stato HTTP 2) Devo premere Ctrl + D dopo aver visto la richiesta di chiudere la connessione 3) non lo sa come reagire all'intestazione 'Aspettatevi: 100-continua' 4) non sa come gestire l'intestazione 'Transfer-Encoding: chunked' - probabilmente mostra solo il primo (probabilmente) blocco vuoto
maxschlepzig

Domanda simile su StackOverflow: stackoverflow.com/questions/5725430/...
maxschlepzig

Risposte:


16

Semplici strumenti della riga di comando come nc, socatsembrano non essere in grado di gestire le specifiche cose HTTP in corso (blocchi, codifiche di trasferimento, ecc.). Di conseguenza, ciò può produrre comportamenti imprevisti rispetto alla comunicazione con un vero server Web. Quindi, il mio primo pensiero è quello di condividere il modo più veloce che conosco di configurare un piccolo server Web e farlo semplicemente fare quello che vuoi: scaricare tutto l'output.

Il più breve che ho potuto inventare usando 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()

Sostituisci la pprintriga per generare solo i campi specifici necessari, ad esempio self.request.bodyo self.request.headers. Nell'esempio sopra è in ascolto sulla porta 8080, su tutte le interfacce.

Le alternative a questo sono molte. web.py , Bottle , ecc.

(Sono abbastanza orientato a Python, scusa)


Se non ti piace il suo modo di emettere, eseguilo comunque e prova in tcpdumpquesto modo:

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

per vedere un dump grezzo reale di tutte le richieste HTTP-POST. In alternativa, esegui Wireshark.


1
Per gli altri che trovano questo frammento molto utile - fa quello che è stato chiesto - ma se vuoi vedere il corpo POST, lo è pprint.pprint(self.request.body). Nota self.request.bodypiuttosto che self.body. Lo stesso per self.request.headers. Vedi tornado.readthedocs.org/en/latest/…
mozz100

40

Lo stavo cercando anch'io e mi sono imbattuto nel server http-echo-Node.js :

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

Accetta tutte le richieste ed echo la richiesta completa inclusa l'intestazione alla riga di comando.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.