Maison > développement back-end > Golang > Comment Go Middleware peut-il contrôler les en-têtes HTTP pour éviter les en-têtes de serveur en double ?

Comment Go Middleware peut-il contrôler les en-têtes HTTP pour éviter les en-têtes de serveur en double ?

Mary-Kate Olsen
Libérer: 2024-11-21 03:28:14
original
565 Les gens l'ont consulté

How Can Go Middleware Control HTTP Headers to Prevent Duplicate Server Headers?

Contrôle des en-têtes HTTP à partir d'un middleware Go externe

Dans ce scénario, vous disposez d'un middleware Go, Server, que vous souhaitez utiliser pour remplacer tous les en-têtes de serveur existants par un valeur personnalisée. Cependant, si l'un des gestionnaires de la chaîne de requêtes appelle w.Header().Add("Server", "foo"), cela entraîne plusieurs en-têtes de serveur dans la réponse.

Le comportement prévu est d'avoir Server le middleware ajoute sa valeur d'en-tête uniquement après que tous les autres en-têtes ont été écrits. Cependant, la sémantique de ServeHTTP dicte que les en-têtes doivent être écrits avant la fin de l'appel.

Utilisation d'un ResponseWriter personnalisé

Une solution de contournement consiste à créer un ResponseWriter personnalisé qui intercepte toutes les écritures d'en-tête et insère le serveur. en-tête juste avant que tous les en-têtes soient vidés. Voici un exemple :

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

func (s serverWriter) WriteHeader(code int) {
    if !s.wroteHeader {
        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
Remarque : Cette approche nécessite une couche d'indirection supplémentaire.

Middleware serveur mis à jour

Le middleware serveur mis à jour peut ensuite exploiter ce ResponseWriter personnalisé :

// 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

Cette solution garantit que l'en-tête du serveur est ajouté au moment approprié, quel que soit le moment ou l'endroit où les en-têtes sont ajoutés. dans la chaîne de requêtes.

Pour plus d'informations, vous pouvez vous référer à https://kev.inburke.com/kevin/how-to-write-go-middleware/.

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