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

Comment inspecter et modifier le corps de réponse d'un proxy inverse en Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-13 07:17:021036parcourir

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

Comment inspecter le corps de réponse du proxy inverse

Dans le code Go donné, un proxy inverse est configuré pour rediriger les demandes vers www.google.com. Alors que le proxy inverse fonctionne correctement, la question se pose : comment accéder au corps de réponse de la requête proxy ?

La solution à ce problème réside dans le package httputil, qui fournit le type ReverseProxy. Dans la dernière version du package, ReverseProxy propose une fonction ModifyResponse facultative qui permet de personnaliser et d'inspecter la réponse provenant du backend.

Plus précisément, en implémentant cette fonction, les développeurs peuvent modifier le *http.Response avant de transmettre au client. Un cas d'utilisation potentiel de ModifyResponse consiste à lire et à manipuler le corps de la réponse.

Pour démontrer cela, considérons le code modifié suivant :

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

Dans ce code, la fonction ModifyResponse est définie pour lire le corps de la réponse HTML, modifiez-le en remplaçant une chaîne particulière, puis définissez le corps modifié comme corps de la réponse. En gérant le chemin d'URL "/google", les requêtes adressées à www.google.com seront transmises par proxy et la réponse modifiée sera renvoyé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!

Déclaration:
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