ホームページ >バックエンド開発 >Golang >後続のハンドラーのデータを失わずに HTTP リクエスト本文を検査するにはどうすればよいですか?

後続のハンドラーのデータを失わずに HTTP リクエスト本文を検査するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-25 01:27:14485ブラウズ

How Can I Inspect an HTTP Request Body Without Losing Data for Subsequent Handlers?

HTTP.Handler による本文の検査中にリクエストの状態を保持する

HTTP ハンドラーの実装のコンテキストでは、次のようなメソッドを使用してリクエストの本文にアクセスします。 req.ParseForm() はジレンマを引き起こす可能性があります。このような検査は多くの場合必要ですが、リクエストのボディ ストリームが枯渇し、後続のハンドラー (リバース プロキシなど) で使用できなくなる可能性があります。

問題: ボディ ストリームの枯渇

req.ParseForm() などのメソッドを呼び出してリクエスト本文が消費されると、req.Body.Reader ストリームはドレインされ、ダウンストリーム ハンドラーにデータは残りません。これにより、予想されるリクエスト本文の長さが枯渇状態と一致しなくなるため、プロキシ転送時にエラーが発生します。

解決策: 本文ストリームを分割します

この課題を克服するには、緩衝層を含む技術を使用することができる。リクエスト本文をバッファに読み取り、そのバッファを使用して複数の新しいリーダーを作成することで、元の本文ストリームから検査を分離できます。

手順:

  1. io.ReadAll(r.Body) を使用して元のリクエスト本文をバッファに読み込みます。
  2. buffer.
  3. ボディ検査を実行するために 1 つの新しいリーダーを使用します (例: doStuff(rdr1))。
  4. 2 番目の新しいリーダーを r.Body に割り当て、後続の元の状態を保持します。 handlers.

例:

buf, _ := io.ReadAll(r.Body)
rdr1 := io.NopCloser(bytes.NewBuffer(buf))
rdr2 := io.NopCloser(bytes.NewBuffer(buf))

doStuff(rdr1)
r.Body = rdr2

利点:

  1. リクエストを保持状態: 元の req.Body は後続のためにそのまま残ります。 handlers.
  2. ボディ解析をサポート: req.ParseForm() のような検査メソッドは、リクエストの状態に影響を与えることなく別のリーダーで使用できます。
  3. カスタムをサポートボディ処理: 個別のリーダーにより、ダウンストリームに干渉することなくカスタムボディ処理が可能になります。操作。

以上が後続のハンドラーのデータを失わずに HTTP リクエスト本文を検査するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。