ホームページ >バックエンド開発 >Golang >リバース プロキシ時に HTTP リクエスト本文の整合性を維持するにはどうすればよいですか?

リバース プロキシ時に HTTP リクエスト本文の整合性を維持するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-16 04:28:21451ブラウズ

How Can I Preserve HTTP Request Body Integrity When Reverse Proxying?

リバース プロキシ用の HTTP リクエスト本文の整合性の保持

問題:

ServeHTTP メソッドを実装するカスタム HTTP ハンドラーでは、 req.ParseForm() を使用して受信 POST リクエストの本文を検査すると、リクエストがリバース プロキシに渡されるときにエラーが発生します。これは、本文を読み取ると req.Body.Reader ストリームが排出され、後続のコンシューマには何も残らないために発生します。

解決策:

本文については、次の手法を検討してください。

  1. 次を使用してリクエスト本文をバッファに読み込みます。 io.ReadAll(r.Body).
  2. io.NopCloser(bytes.NewBuffer(buf)) を使用して、バッファーをバックアップとする 2 つの新しいリーダー rdr1 と rdr2 を作成します。
  3. rdr1 を使用して、ボディを検査し、必要なアクションを実行します。
  4. r.Body を rdr2 にリセットして、オリジナルを保持します。リバース プロキシのリクエスト状態。

コード例:

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

doStuff(rdr1)
r.Body = rdr2 // Resets the request body without consuming any data

注:

バイト。 Close() メソッドがないため、バッファには io.ReadCloser インターフェイスが実装されていません。したがって、各リーダーは io.NopCloser でラップされます。

以上がリバース プロキシ時に HTTP リクエスト本文の整合性を維持するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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