Heim >Backend-Entwicklung >Golang >Wie kann Go Middleware HTTP-Header steuern, um doppelte Server-Header zu verhindern?
In diesem Szenario verfügen Sie über eine Go-Middleware, einen Server, den Sie verwenden möchten, um alle vorhandenen Server-Header mit einem zu überschreiben benutzerdefinierter Wert. Wenn jedoch irgendwelche Handler in der Anforderungskette w.Header().Add("Server", "foo") aufrufen, führt dies zu mehreren Server-Headern in der Antwort.
Das beabsichtigte Verhalten besteht darin, Server zu haben Middleware hängt ihren Headerwert erst an, nachdem alle anderen Header geschrieben wurden. Die Semantik von ServeHTTP schreibt jedoch vor, dass Header geschrieben werden müssen, bevor der Aufruf abgeschlossen wird.
Eine Problemumgehung besteht darin, einen benutzerdefinierten ResponseWriter zu erstellen, der alle Header-Schreibvorgänge abfängt und den Server einfügt Header, kurz bevor alle Header geleert werden. Hier ist ein Beispiel:
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() }
Hinweis: Dieser Ansatz erfordert eine zusätzliche Indirektionsebene.
Die aktualisierte Server-Middleware kann dann diesen benutzerdefinierten ResponseWriter nutzen:
// 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) }) }
Diese Lösung stellt sicher, dass der Server-Header zum richtigen Zeitpunkt hinzugefügt wird, unabhängig davon, wann oder wo Header hinzugefügt werden in der Anforderungskette.
Weitere Einblicke finden Sie unter https://kev.inburke.com/kevin/how-to-write-go-middleware/.
Das obige ist der detaillierte Inhalt vonWie kann Go Middleware HTTP-Header steuern, um doppelte Server-Header zu verhindern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!