Maison >développement back-end >Golang >Comment remplacer les en-têtes HTTP dans le middleware Go sans duplication ?

Comment remplacer les en-têtes HTTP dans le middleware Go sans duplication ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-03 16:29:11502parcourir

How to Override HTTP Headers in Go Middleware Without Duplication?

Remplacement des en-têtes HTTP du middleware Go externe

Arrière-plan

Le middleware dans Go est utilisé pour intercepter et modifier les demandes et les réponses avant qu’elles n’atteignent le gestionnaire. Cependant, lorsque plusieurs composants middleware modifient le même en-tête, cela peut entraîner la définition de plusieurs instances de cet en-tête dans la réponse.

Considérez l'exemple de middleware suivant :

func Server(h http.Handler, serverName string) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Server", serverName)
        h.ServeHTTP(w, r)
    })
}

Lorsque ce middleware est utilisé avec d'autres middleware qui définissent l'en-tête "Serveur", il en résulte plusieurs en-têtes "Serveur" dans la réponse.

Personnalisé ResponseWriter

Pour résoudre ce problème, nous pouvons créer un ResponseWriter personnalisé qui intercepte l'appel WriteHeader() et définit l'en-tête approprié avant de transmettre la requête plus loin.

type serverWriter struct {
    w           http.ResponseWriter
    name        string
    wroteHeader bool
}

func (s serverWriter) WriteHeader(code int) {
    if s.wroteHeader == false {
        s.w.Header().Set("Server", s.name)
        s.wroteHeader = true
    }
    s.w.WriteHeader(code)
}

func (s serverWriter) Write(b []byte) (int, error) {
    return s.w.Write(b)
}

func (s serverWriter) Header() http.Header {
    return s.w.Header()
}

En utilisant ce ResponseWriter personnalisé dans notre middleware serveur, nous pouvons nous assurer que l'en-tête "Serveur" est défini uniquement une fois.

func Server(h http.Handler, serverName string) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        sw := serverWriter{
            w:           w,
            name:        serverName,
            wroteHeader: false,
        }
        h.ServeHTTP(sw, r)
    })
}

Cette solution nous permet de contrôler les en-têtes HTTP du middleware externe sans violer la sémantique de ServeHTTP.

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