Mengawal Pengepala HTTP daripada Outer Go Middleware
Perisian tengah HTTP dalam Go menyediakan cara yang mudah untuk memintas dan mengubah suai permintaan dan respons HTTP. Walau bagaimanapun, mengawal pengepala daripada perisian tengah luar boleh menjadi mencabar, kerana ia memerlukan mengatasi pengepala sedia ada tanpa memperkenalkan pendua.
Pertimbangkan perisian tengah pelayan berikut yang menetapkan pengepala "Pelayan":
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) }) }
Apabila ditambahkan pada rantai tindak balas, perisian tengah ini berjaya menetapkan pengepala "Pelayan". Walau bagaimanapun, jika mana-mana pengendali lain dalam rantaian turut menetapkan pengepala "Pelayan", pengepala pendua akan menghasilkan respons.
Cabaran timbul kerana ServeHTTP secara eksplisit melarang menulis kepada ResponseWriter selepas permintaan selesai. Satu pendekatan adalah untuk mencipta ResponseWriter tersuai yang memintas menulis pengepala dan memasukkan pengepala "Pelayan" sebelum penulisan pertama.
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() } // 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) }) }
Dengan menggunakan ResponseWriter tersuai, kami boleh memastikan bahawa pengepala "Pelayan" ditambahkan sekali sahaja, tidak kira kelakuan pengendali lain. Pendekatan ini memperkenalkan lapisan amaran tambahan, tetapi ia mengekalkan kefungsian yang diingini.
Atas ialah kandungan terperinci Bagaimana Go Middleware Boleh Mengawal Pengepala HTTP Tanpa Pertindihan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!