Maison >développement back-end >Golang >Comment Go Middleware peut-il contrôler de manière fiable les en-têtes HTTP sans duplication ?

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

Linda Hamilton
Linda Hamiltonoriginal
2024-11-24 12:30:26990parcourir

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

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

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!

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