Общий HTTP-сервер, который просто сбрасывает POST-запросы?

24

Я ищу инструмент командной строки, который прослушивает заданную часть, с радостью исключает каждый запрос HTTP POST и выводит его.

Я хочу использовать его для тестирования, то есть для тестирования клиентов, которые выдают запросы HTTP POST.

Это означает , что я ищу коллегу к curl -F(который я могу использовать для отправки теста HTTP сообщений на сервер HTTP).

Возможно, что-то вроде socat TCP4-LISTEN:80,fork,bind=127.0.0.1 ...- но socat недостаточно, потому что он не говорит по HTTP.

maxschlepzig
источник
1
Может быть, я не правильно понимаю вопрос, но если все, что вам нужно, это сбросить запрос POST, вы можете использовать netcat( ncв некоторых системах) с опциями -l(listen) и -p(number port).
Петер
1
@peterph, вы можете использовать ncдля частичного тестирования - но я вижу следующие недостатки: 1) он не отправляет код состояния HTTP 2) я должен нажать Ctrl + D после того, как я вижу запрос на закрытие соединения 3) он не знает как реагировать на заголовок «Expect: 100-continue» 4) он не знает, как обрабатывать заголовок «Transfer-Encoding: chunked» - он, вероятно, просто отображает первый (вероятно) пустой блок
maxschlepzig
Аналогичный вопрос по stackoverflow: stackoverflow.com/questions/5725430/…
maxschlepzig

Ответы:

16

Простые основные инструменты командной строки, такие как nc, socatкажется, не в состоянии обрабатывать конкретные происходящие HTTP-компоненты (чанки, кодировки передачи и т. Д.). В результате это может привести к неожиданному поведению по сравнению с общением с реальным веб-сервером. Итак, моя первая мысль - поделиться самым быстрым из известных мне способов настройки крошечного веб-сервера и заставить его делать то, что вы хотите: выводить весь вывод.

Самое короткое, что я мог придумать, используя 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()

Замените pprintстроку, чтобы вывести только нужные вам поля, например self.request.bodyили self.request.headers. В приведенном выше примере он прослушивает порт 8080 на всех интерфейсах.

Альтернативы этому много. web.py , бутылка и т. д.

(Я довольно ориентирован на Python, извините)


Если вам не нравится способ вывода, просто запустите его и попробуйте tcpdumpтак:

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

чтобы увидеть настоящий необработанный дамп всех запросов HTTP-POST. Или просто запустите Wireshark.

gertvdijk
источник
1
Для других, которые находят этот очень полезный фрагмент - он делает то, что просили - но если вы хотите увидеть тело POST, это pprint.pprint(self.request.body). Обратите внимание, self.request.bodyа не self.body. То же самое для self.request.headers. См tornado.readthedocs.org/en/latest/...
mozz100