¿Servidor HTTP genérico que solo voltea las solicitudes POST?

24

Estoy buscando una herramienta de línea de comandos que escuche en una parte determinada, felizmente exceptúa cada solicitud HTTP POST y la volca.

Quiero usarlo con fines de prueba, es decir, para probar clientes que emiten solicitudes HTTP POST.

Eso significa que estoy buscando la contraparte de curl -F(que puedo usar para enviar POST HTTP de prueba a un servidor HTTP).

Quizás algo así socat TCP4-LISTEN:80,fork,bind=127.0.0.1 ..., pero socat no es suficiente porque no habla HTTP.

maxschlepzig
fuente
1
Tal vez no entiendo la pregunta correctamente, pero si todo lo que necesita es volcar la solicitud POST, puede usar netcat( ncen algunos sistemas) con las opciones -l(escuchar) y -p(número de puerto).
Peter
1
@peterph, puede usar ncpara pruebas parciales, pero puedo ver las siguientes desventajas: 1) no envía el código de estado HTTP 2) Tengo que presionar Ctrl + D después de ver la solicitud para cerrar la conexión 3) no sabe cómo reaccionar ante el encabezado 'Esperar: 100-continuar' 4) no sabe cómo manejar el encabezado 'Transferencia-Codificación: fragmentado' - probablemente solo muestra el primer (probablemente) fragmento vacío
maxschlepzig
Pregunta similar sobre stackoverflow: stackoverflow.com/questions/5725430/…
maxschlepzig

Respuestas:

16

Las herramientas de línea de comandos básicas simples como nc, socatparecen no ser capaces de manejar las cosas HTTP específicas que están sucediendo (fragmentos, codificaciones de transferencia, etc.). Como resultado, esto puede producir un comportamiento inesperado en comparación con hablar con un servidor web real. Entonces, mi primer pensamiento es compartir la forma más rápida que conozco de configurar un pequeño servidor web y hacer que simplemente haga lo que quiera: volcar toda la salida.

Lo más corto que se me ocurrió usar 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()

Reemplace la pprintlínea para generar solo los campos específicos que necesita, por ejemplo self.request.bodyo self.request.headers. En el ejemplo anterior, escucha en el puerto 8080, en todas las interfaces.

Las alternativas a esto son muchas. web.py , botella , etc.

(Estoy bastante orientado a Python, lo siento)


Si no le gusta su forma de salida, simplemente ejecútelo de todos modos e intente tcpdumpasí:

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

para ver un volcado sin procesar real de todas las solicitudes HTTP-POST. Alternativamente, solo ejecuta Wireshark.

gertvdijk
fuente
1
Para otros que encuentran este fragmento muy útil, hace lo que se le pidió, pero si desea ver el cuerpo POST, lo es pprint.pprint(self.request.body). Nota en self.request.bodylugar de self.body. Lo mismo para self.request.headers. Ver tornado.readthedocs.org/en/latest/…
mozz100
40

Yo también estaba buscando esto y me encontré con el servidor http-echo-Node.js :

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

Acepta todas las solicitudes y hace eco de la solicitud completa, incluido el encabezado de la línea de comandos.

Tobias
fuente