Dalam senario ini, anda mempunyai perisian tengah Go, Pelayan, yang anda mahu gunakan untuk mengatasi mana-mana pengepala Pelayan sedia ada dengan nilai tersuai. Walau bagaimanapun, jika mana-mana pengendali ke bawah rantaian permintaan memanggil w.Header().Add("Server", "foo"), ia menghasilkan berbilang pengepala Pelayan dalam respons.
Tingkah laku yang dimaksudkan adalah untuk mempunyai Pelayan middleware menambah nilai pengepalanya hanya selepas semua pengepala lain telah ditulis. Walau bagaimanapun, semantik ServeHTTP menentukan bahawa pengepala mesti ditulis sebelum panggilan selesai.
Satu penyelesaian adalah untuk mencipta ResponseWriter tersuai yang memintas semua penulisan pengepala dan memasukkan Pelayan pengepala sejurus sebelum semua pengepala disiram. Berikut ialah contoh:
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() }
Nota: Pendekatan ini memerlukan lapisan amaran tambahan.
Perisian tengah Pelayan yang dikemas kini kemudiannya boleh memanfaatkan ResponseWriter tersuai ini:
// 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) }) }
Penyelesaian ini memastikan bahawa pengepala Pelayan ditambahkan pada masa yang sesuai, tidak kira bila atau di mana pengepala ditambahkan dalam rantaian permintaan.
Untuk mendapatkan maklumat lanjut, anda boleh merujuk kepada https://kev.inburke.com/kevin/how-to-write-go-middleware/.
Atas ialah kandungan terperinci Bagaimanakah Go Middleware Kawalan Pengepala HTTP untuk Menghalang Pengepala Pelayan Pendua?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!