Servidor HTTP genérico que apenas despeja solicitações POST?

24

Estou procurando uma ferramenta de linha de comando que escute uma determinada parte, exceda felizmente cada solicitação HTTP POST e a despeje.

Eu quero usá-lo para fins de teste, ou seja, para testar clientes que emitem solicitações HTTP POST.

Isso significa que estou pesquisando a contraparte curl -F(a qual posso usar para enviar POSTs HTTP de teste para um servidor HTTP).

Talvez algo como socat TCP4-LISTEN:80,fork,bind=127.0.0.1 ...- mas o socat não é suficiente porque não fala HTTP.

maxschlepzig
fonte
1
Talvez eu não entenda a pergunta corretamente, mas se tudo o que você precisa é despejar a solicitação POST, você pode usar netcat( ncem alguns sistemas) as opções -l(escutar) e -p(número da porta).
Peterph
1
@peterph, você pode usar ncpara testes parciais - mas vejo as seguintes desvantagens: 1) ele não envia o código de status HTTP 2) eu tenho que pressionar Ctrl + D depois de ver a solicitação para fechar a conexão 3) ele não sabe como reagir em cima, em seguida, 'esperado: 100-continue' cabeçalho 4) ele não sabe como lidar com o 'Transfer-Encoding: blocos' cabeçalho - é, provavelmente, apenas exibe o primeiro (provavelmente) pedaço vazio
maxschlepzig
Pergunta semelhante sobre stackoverflow: stackoverflow.com/questions/5725430/...
maxschlepzig

Respostas:

16

Ferramentas básicas simples de linha de comando nc, como , socatparecem não conseguir lidar com o material HTTP específico em andamento (pedaços, codificações de transferência etc.). Como resultado, isso pode produzir um comportamento inesperado em comparação com a conversa com um servidor da Web real. Portanto, meu primeiro pensamento é compartilhar o modo mais rápido que conheço de configurar um pequeno servidor Web e fazê-lo fazer o que você deseja: despejar toda a saída.

O mais curto que pude usar o 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()

Substitua a pprintlinha para gerar apenas os campos específicos necessários, por exemplo self.request.bodyou self.request.headers. No exemplo acima, ele escuta na porta 8080, em todas as interfaces.

Alternativas para isso são muitas. web.py , garrafa etc.

(Eu sou bastante orientado para Python, desculpe)


Se você não gostar do modo de saída, execute-o de qualquer maneira e tente tcpdumpassim:

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

para ver um despejo bruto real de todas as solicitações HTTP-POST. Como alternativa, basta executar o Wireshark.

gertvdijk
fonte
1
Para outras pessoas que acham esse snippet muito útil - faz o que foi solicitado - mas se você deseja ver o corpo do POST, é pprint.pprint(self.request.body). Observe em self.request.bodyvez de self.body. O mesmo para self.request.headers. Veja tornado.readthedocs.org/en/latest/…
mozz100
40

Eu estava procurando por isso mesmo tão bem e correu para o Node.js http-eco-servidor :

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

Ele aceita todas as solicitações e faz eco da solicitação completa, incluindo o cabeçalho da linha de comando.

Tobias
fonte