Bagaimana Go Middleware Boleh Mengawal Pengepala HTTP Tanpa Pertindihan?

Linda Hamilton
Lepaskan: 2024-11-24 12:30:26
asal
915 orang telah melayarinya

How Can Go Middleware Reliably Control HTTP Headers Without Duplication?

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)
    })
}
Salin selepas log masuk

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)
    })
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan