Remplacement des en-têtes HTTP du middleware Go externe
Arrière-plan
Le middleware dans Go est utilisé pour intercepter et modifier les demandes et les réponses avant qu’elles n’atteignent le gestionnaire. Cependant, lorsque plusieurs composants middleware modifient le même en-tête, cela peut entraîner la définition de plusieurs instances de cet en-tête dans la réponse.
Considérez l'exemple de middleware suivant :
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) }) }
Lorsque ce middleware est utilisé avec d'autres middleware qui définissent l'en-tête "Serveur", il en résulte plusieurs en-têtes "Serveur" dans la réponse.
Personnalisé ResponseWriter
Pour résoudre ce problème, nous pouvons créer un ResponseWriter personnalisé qui intercepte l'appel WriteHeader() et définit l'en-tête approprié avant de transmettre la requête plus loin.
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() }
En utilisant ce ResponseWriter personnalisé dans notre middleware serveur, nous pouvons nous assurer que l'en-tête "Serveur" est défini uniquement une fois.
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) }) }
Cette solution nous permet de contrôler les en-têtes HTTP du middleware externe sans violer la sémantique de ServeHTTP.
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!