Maison > développement back-end > Golang > Comment inspecter et modifier le corps de réponse dans un proxy inverse Go ?

Comment inspecter et modifier le corps de réponse dans un proxy inverse Go ?

Linda Hamilton
Libérer: 2024-11-07 22:48:02
original
386 Les gens l'ont consulté

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

Comment inspecter et modifier le corps de réponse dans ReverseProxy

Dans le code Go fourni, un proxy inverse est configuré pour rediriger les requêtes vers Google. Cependant, pour obtenir des informations plus approfondies ou personnaliser les réponses, il est essentiel d'accéder au corps de la réponse.

La solution réside dans l'exploitation du champ ModifyResponse dans la structure ReverseProxy. Ce champ permet de spécifier une fonction qui modifie la réponse HTTP avant qu'elle n'atteigne le client.

Implémentation

Le code modifié suivant montre comment lire et modifier le corps de la réponse :

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)
}
Copier après la connexion

Comment ça marche

La fonction ModifyResponse lit le corps de la réponse d'origine dans un tampon à l'aide d'ioutil.ReadAll. Il ferme ensuite le resp.Body d'origine et modifie le contenu du corps.

Pour garantir la validité de la réponse, un nouveau corps est créé et attribué à resp.Body. L'en-tête Content-Length est également mis à jour pour refléter la nouvelle longueur du corps.

Enfin, le corps de la réponse modifié est imprimé sur la console pour une inspection facile, et la resp modifiée est envoyée au client.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal