POSTリクエストのみをダンプする一般的なHTTPサーバー?

POSTリクエストのみをダンプする一般的なHTTPサーバー?

私は与えられたセクションを聞き、すべてのHTTP POSTリクエストを除いてダンプできるコマンドラインツールを探しています。

テスト目的、つまりHTTP POSTリクエストを行うクライアントをテストするために使用したいと思います。

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

おそらくそうかもしれませんが、socat TCP4-LISTEN:80,fork,bind=127.0.0.1 ...socatはHTTPをサポートしていないので十分ではありません。

答え1

私もこれを探しています。Node.js http-echo-serverとの出会い:

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

すべてのリクエストを受け入れ、リクエスト全体(ヘッダーを含む)をコマンドラインに表示します。

答え2

単純なコアコマンドラインツール(例:http://github.com nc)は、socat進行中の特定のHTTP操作(チャンク、トランスポートエンコーディングなど)を処理できないようです。したがって、実際のWebサーバーと通信するときと比較して予期しない動作が発生する可能性があります。だから私の最初の考えは、小さなWebサーバーを設定し、必要なタスクを実行する最速の方法、つまりすべての出力をダンプする方法を共有することでした。

私が考える最も短い使用時間はPython竜巻:

#!/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必要な特定のフィールドのみを出力するには、この行を置き換えます。上記の例では、すべてのインターフェイスのポート8080でリッスンします。self.request.bodyself.request.headers

これには多くの選択肢があります。network.pyボトル、等。

(私はPython指向です。申し訳ありません。)


出力方法が気に入らない場合は、実行してtcpdump次のことを試してください。

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

すべてのHTTP-POSTリクエストの実際の生のダンプを表示します。またはWiresharkを実行してください。

答え3

使用nc(「で発音)インターネット猫")。

どのポートでリッスンするかを通知します。

nc -kl 8888

その後、別の端末ウィンドウから要求を送信します。

curl localhost:8888 -d hello=world

送信したデータ(この場合はHTTP要求)を印刷します。

POST / HTTP/1.1
Host: localhost:8888
User-Agent: curl/7.84.0
Accept: */*
Content-Length: 11
Content-Type: application/x-www-form-urlencoded

hello=world

この-kオプションは、要求を受信して​​無期限に印刷することを意味します。そのオプションがない場合(たとえばnc -l 8888)、最初の要求の後に終了します。

答え4

Python標準ライブラリはバッテリーに付属しています。つまり、単純なHTTP要求ダンパーを作成するために使用できるHTTPサーバーパッケージも含まれています。

#!/usr/bin/env python3

import argparse
import http.server
import json
import sys

class Dumper(http.server.BaseHTTPRequestHandler):
    def do_GET(self, method='GET'):
        print(f'\n{method} {self.path}\n{self.headers}')
        self.send_response(200)
        self.end_headers()

    def do_DELETE(self):
        return self.do_GET('DELETE')

    def do_POST(self, method='POST'):
        n = int(self.headers.get('content-length', 0))
        body = self.rfile.read(n)
        print(f'\n{method} {self.path}\n{self.headers}{body}\n')
        if self.headers.get('content-type') == 'application/json':
            d = json.loads(body)
            print(json.dumps(d, indent=4, sort_keys=True))
            print()
        self.send_response(200)
        self.end_headers()

    def do_PUT(self):
        return self.do_POST('PUT')

    def log_message(self, format, *args):
        pass

いくつかのサンプル:


def main():
    p = argparse.ArgumentParser(description='Dump HTTP requests to stdout')
    p.add_argument('address', help='bind address')
    p.add_argument('port', type=int, help='bind port')
    xs = p.parse_args();
    s = http.server.HTTPServer((xs.address, xs.port), Dumper)
    s.serve_forever()

if __name__ == '__main__':
    sys.exit(main())

また見なさい:私のテイクアウト

関連情報