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!