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
Libérer: 2024-12-03 16:29:11
original
496 Les gens l'ont consulté

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

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

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

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!

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