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

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

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-07 22:48:02363ブラウズ

How do I Inspect and Modify the Response Body in a Go Reverse Proxy?

ReverseProxy で応答本文を検査および変更する方法

提供された Go コードでは、リクエストを Google にリダイレクトするためにリバース プロキシが設定されています。ただし、より深い洞察を得る、または応答をカスタマイズするには、応答本文にアクセスすることが不可欠です。

解決策は、ReverseProxy 構造体内の ModifyResponse フィールドを利用することにあります。このフィールドを使用すると、HTTP 応答がクライアントに到達する前に変更する関数を指定できます。

実装

次の変更されたコードは、応答本文の読み取りと変更方法を示しています。

package main

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

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

    // Modify the response body before sending it to the client
    proxy.ModifyResponse = func(resp *http.Response) (err error) {
        b, err := ioutil.ReadAll(resp.Body) // Read the response body
        if err != nil {
            return err
        }
        err = resp.Body.Close() // Close the `Body` and `resp`
        if err != nil {
            return err
        }

        // Modify the response body
        b = bytes.Replace(b, []byte("server"), []byte("schmerver"), -1)

        // Create a new `body` to keep the `Content-Length` and `Body` up-to-date
        body := ioutil.NopCloser(bytes.NewReader(b))
        resp.Body = body
        resp.ContentLength = int64(len(b))
        resp.Header.Set("Content-Length", strconv.Itoa(len(b)))

        fmt.Println("Modified response: ", string(b)) // See the modified response

        return nil
    }

    http.Handle("/google", proxy)
    http.ListenAndServe(":8099", nil)
}

仕組み

ModifyResponse 関数は、ioutil.ReadAll を使用して元の応答本文をバッファーに読み取ります。次に、元の resp.Body を閉じ、本文の内容を変更します。

応答が有効であることを確認するために、新しい本文が作成され、resp.Body に割り当てられます。 Content-Length ヘッダーも、新しい本文の長さを反映するように更新されます。

最後に、変更された応答本文が簡単に検査できるようにコンソールに出力され、変更された応答がクライアントに送信されます。

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

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