Überschreiben von HTTP-Headern von externer Go-Middleware
Hintergrund
Middleware in Go ist es gewohnt Anfragen und Antworten abfangen und ändern, bevor sie den Handler erreichen. Wenn jedoch mehrere Middleware-Komponenten denselben Header ändern, kann dies dazu führen, dass mehrere Instanzen dieses Headers in der Antwort festgelegt werden.
Betrachten Sie die folgende Beispiel-Middleware:
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) }) }
Wenn diese Middleware Wird zusammen mit anderer Middleware verwendet, die den „Server“-Header festlegt, führt dies zu mehreren „Server“-Headern in der Antwort.
Benutzerdefiniert ResponseWriter
Um dieses Problem zu beheben, können wir einen benutzerdefinierten ResponseWriter erstellen, der den WriteHeader()-Aufruf abfängt und den entsprechenden Header festlegt, bevor die Anfrage weitergegeben wird.
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() }
Durch die Verwendung Mit diesem benutzerdefinierten ResponseWriter in unserer Server-Middleware können wir sicherstellen, dass der „Server“-Header nur einmal festgelegt wird.
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) }) }
Dies Die Lösung ermöglicht es uns, die HTTP-Header von der äußeren Middleware aus zu steuern, ohne die Semantik von ServeHTTP zu verletzen.
Das obige ist der detaillierte Inhalt vonWie überschreibe ich HTTP-Header in der Go-Middleware ohne Duplizierung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!