Загальний сервер HTTP, який просто скидає POST-запити?


24

Я шукаю інструмент командного рядка, який слухає задану частину, із задоволенням виключає кожен запит HTTP POST і скидає його.

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

Це означає, що я шукаю аналог curl -F(який я можу використовувати для надсилання тестових HTTP POST на сервер HTTP).

Можливо, щось на кшталт socat TCP4-LISTEN:80,fork,bind=127.0.0.1 ...- але socat недостатньо, тому що він не розмовляє HTTP.


1
Можливо, я неправильно не розумію питання, але якщо все, що вам потрібно, це скинути запит POST, ви можете використовувати netcat( ncв деяких системах) параметри -l(прослуховування) та -p(номер порту).
петерф

1
@peterph, ви можете використовувати ncдля часткового тестування - але я бачу такі недоліки: 1) він не надсилає код статусу HTTP 2) я повинен натиснути Ctrl + D після того, як я побачу запит на закриття з'єднання 3) він не знає як реагувати на тодішній заголовок "Очікуйте: 100-продовження" 4), він не знає, як обробити заголовок "Передача-кодування: відрізка" - він, ймовірно, просто відображає перший (можливо) порожній фрагмент
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.


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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.