Heim >Backend-Entwicklung >Golang >Wie kann Go Middleware HTTP-Header steuern, um doppelte Server-Header zu verhindern?

Wie kann Go Middleware HTTP-Header steuern, um doppelte Server-Header zu verhindern?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-21 03:28:14528Durchsuche

How Can Go Middleware Control HTTP Headers to Prevent Duplicate Server Headers?

HTTP-Header von externer Go-Middleware steuern

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.

Verwenden eines benutzerdefinierten ResponseWriter

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.

Aktualisierte Server-Middleware

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn