首頁 > 後端開發 > Golang > 如何檢查和修改 Go 反向代理中的回應正文?

如何檢查和修改 Go 反向代理中的回應正文?

Linda Hamilton
發布: 2024-11-07 22:48:02
原創
385 人瀏覽過

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並修改body內容。

為了確保回應有效,建立了一個新的body並將其指派給resp.Body。 Content-Length 標頭也會更新以反映新的正文長度。

最後,將修改後的回應正文列印到控制台以方便檢查,並將修改後的回應傳送到客戶端。

以上是如何檢查和修改 Go 反向代理中的回應正文?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板