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

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