POST要求をダンプするだけの汎用HTTPサーバー?


24

私は、すべてのHTTP POSTリクエストを喜んで除外してダンプする、特定の部分をリッスンするコマンドラインツールを探しています。

テスト目的、つまりHTTP POSTリクエストを発行するクライアントのテストに使用します。

これは、対応するものを検索していることを意味curl -Fします(テストHTTP POSTをHTTPサーバーに送信するために使用できます)。

おそらく次のようなものですsocat TCP4-LISTEN:80,fork,bind=127.0.0.1 ...が、HTTPを使用しないのでsocatは十分ではありません。


1
質問を正しく理解していないかもしれませんが、POSTリクエストをダンプすることだけが必要な場合は、netcatnc一部のシステムでは)-l(listen)および-p(port number)オプションを使用できます。
ペテルフ

1
@peterph、nc部分的なテストに使用できますが、次の欠点があります:1)HTTPステータスコードを送信しない2)接続を閉じる要求を確認した後でCtrl + Dを押す必要がある3)わからないそれは、おそらく最初の(おそらく)空のチャンクを表示する-ヘッダー:それはチャンク転送エンコーディング」を処理する方法を知っていないヘッダ4):「100-継続期待」が時にどのように対処するか
maxschlepzig

stackoverflowの上の同様の質問:stackoverflow.com/questions/5725430/...
maxschlepzig

回答:


16

のような単純なコアコマンドラインツールはncsocat進行中の特定のHTTP処理(チャンク、エンコードの転送など)を処理できないようです。その結果、実際のWebサーバーと通信する場合と比較して、予期しない動作が発生する可能性があります。したがって、最初に考えたのは、小さなWebサーバーをセットアップし、必要なことだけを行う最も簡単な方法を共有することです。すべての出力をダンプすることです。

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.pyBottleなど

(私は非常に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.headerstornado.readthedocs.org/en/latest/…を
mozz100

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.