Maison > développement back-end > Golang > le corps du texte

Comment Go Middleware peut-il contrôler de manière fiable les en-têtes HTTP sans duplication ?

Linda Hamilton
Libérer: 2024-11-24 12:30:26
original
915 Les gens l'ont consulté

How Can Go Middleware Reliably Control HTTP Headers Without Duplication?

Contrôle des en-têtes HTTP à partir du middleware Go externe

Le middleware HTTP dans Go fournit un moyen pratique d'intercepter et de modifier les requêtes et les réponses HTTP. Cependant, contrôler les en-têtes à partir d'un middleware externe peut s'avérer difficile, car cela nécessite de remplacer les en-têtes existants sans introduire de doublons.

Considérez le middleware de serveur suivant qui définit l'en-tête « Serveur » :

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

Lorsqu'il est ajouté à la chaîne de réponse, ce middleware définit avec succès l'en-tête « Serveur ». Cependant, si un autre gestionnaire de la chaîne définit également l'en-tête "Serveur", des en-têtes en double entraîneront la réponse.

Le défi se pose car ServeHTTP interdit explicitement l'écriture dans ResponseWriter une fois la requête terminée. Une approche consiste à créer un ResponseWriter personnalisé qui intercepte les écritures d'en-tête et insère l'en-tête "Serveur" avant la première écriture.

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

// Server attaches a Server header to the response.
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

En utilisant un ResponseWriter personnalisé, nous pouvons garantir que l'en-tête "Serveur" est ajouté une seule fois, quel que soit le comportement des autres gestionnaires. Cette approche introduit une couche supplémentaire d'indirection, mais elle conserve la fonctionnalité souhaitée.

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