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.
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() }
Remarque : Cette approche nécessite une couche d'indirection supplémentaire.
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) }) }
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!