Heim >Backend-Entwicklung >Golang >Wie überprüfe und ändere ich den Antworttext in einem Go-Reverse-Proxy?

Wie überprüfe und ändere ich den Antworttext in einem Go-Reverse-Proxy?

Linda Hamilton
Linda HamiltonOriginal
2024-11-07 22:48:02366Durchsuche

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

So prüfen und ändern Sie den Antworttext in ReverseProxy

Im bereitgestellten Go-Code wird ein Reverse-Proxy eingerichtet, um Anfragen an Google umzuleiten. Um jedoch tiefere Einblicke zu gewinnen oder Antworten anzupassen, ist der Zugriff auf den Antworttext unerlässlich.

Die Lösung liegt in der Nutzung des ModifyResponse-Felds innerhalb der ReverseProxy-Struktur. In diesem Feld können Sie eine Funktion angeben, die die HTTP-Antwort ändert, bevor sie den Client erreicht.

Implementierung

Der folgende geänderte Code zeigt, wie der Antworttext gelesen und geändert wird:

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)
}

So funktioniert es

Die ModifyResponse-Funktion liest den ursprünglichen Antworttext mithilfe von ioutil.ReadAll in einen Puffer. Anschließend wird der ursprüngliche resp.Body geschlossen und der Textinhalt geändert.

Um sicherzustellen, dass die Antwort gültig ist, wird ein neuer Text erstellt und resp.Body zugewiesen. Der Content-Length-Header wird ebenfalls aktualisiert, um die neue Textkörperlänge widerzuspiegeln.

Schließlich wird der geänderte Antworttext zur einfachen Überprüfung auf der Konsole gedruckt und die geänderte Antwort an den Client gesendet.

Das obige ist der detaillierte Inhalt vonWie überprüfe und ändere ich den Antworttext in einem Go-Reverse-Proxy?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn