Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah Go Middleware Kawalan Pengepala HTTP untuk Menghalang Pengepala Pelayan Pendua?

Bagaimanakah Go Middleware Kawalan Pengepala HTTP untuk Menghalang Pengepala Pelayan Pendua?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-21 03:28:14492semak imbas

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

Mengawal Pengepala HTTP daripada External Go Middleware

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.

Menggunakan Custom ResponseWriter

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

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn