ホームページ > バックエンド開発 > Golang > Go でリバース プロキシの応答本文を検査および変更するにはどうすればよいですか?

Go でリバース プロキシの応答本文を検査および変更するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-11-13 07:17:02
オリジナル
1090 人が閲覧しました

How to Inspect and Modify the Response Body of a Reverse Proxy in Go?

リバース プロキシの応答本文を検査する方法

指定された Go コードでは、リクエストを www.google.com にリダイレクトするようにリバース プロキシが設定されています。リバース プロキシが正しく機能している間、プロキシされたリクエストの応答本文にどのようにアクセスできるのかという疑問が生じます。

これに対する解決策は、ReverseProxy タイプを提供する httputil パッケージにあります。パッケージの最新バージョンでは、ReverseProxy はバックエンドからの応答のカスタマイズと検査を可能にするオプションの ModifyResponse 関数を提供します。

具体的には、この関数を実装することで、開発者は渡す前に *http.Response を変更できます。それをクライアントに。 ModifyResponse の潜在的な使用例の 1 つは、応答本文の読み取りと操作です。

これを示すために、次の変更されたコードを考えてみましょう。

package main

import (
    "bytes"
    "fmt"
    "io/ioutil"
    "net/http"
    "net/http/httputil"
    "net/url"
)

func main() {
    target := &url.URL{Scheme: "http", Host: "www.google.com"}
    proxy := httputil.NewSingleHostReverseProxy(target)

    proxy.ModifyResponse = func(resp *http.Response) (err error) {
        b, err := ioutil.ReadAll(resp.Body) // Read the HTML response body
        if err != nil {
            return err
        }

        resp.Body.Close() // The body is closed by the ReadAll function, but it's good practice to close it again
        b = bytes.Replace(b, []byte("server"), []byte("schmerver"), -1) // Modify the HTML response by replacing "server" with "schmerver"

        newBody := ioutil.NopCloser(bytes.NewReader(b))
        resp.Body = newBody
        resp.ContentLength = int64(len(b))
        resp.Header.Set("Content-Length", strconv.Itoa(len(b)))
        fmt.Println(resp) // Print the modified response for debugging purposes

        return nil
    }

    http.Handle("/google", proxy)
    http.ListenAndServe(":8099", nil)
}
ログイン後にコピー

このコードでは、ModifyResponse 関数は読み取りを行うように定義されています。 HTML 応答本文を変更し、特定の文字列を置き換えて、変更した本文を応答本文として設定します。 「/google」 URL パスを処理することにより、www.google.com へのリクエストがプロキシされ、変更された応答がクライアントに返されます。

以上がGo でリバース プロキシの応答本文を検査および変更するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート