首頁 >後端開發 >Golang >Go中介軟體如何可靠地控制HTTP頭而不重複?

Go中介軟體如何可靠地控制HTTP頭而不重複?

Linda Hamilton
Linda Hamilton原創
2024-11-24 12:30:26992瀏覽

How Can Go Middleware Reliably Control HTTP Headers Without Duplication?

從外部Go 中間件控制HTTP 標頭

Go 中的HTTP 中間件提供了一種便捷的方法來攔截和修改HTTP 請求和回應。但是,從外部中間件控制標頭可能具有挑戰性,因為它需要覆蓋現有標頭而不引入重複項。

考慮以下設定「伺服器」標頭的伺服器中間件:

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)
    })
}

當新增至回應鏈時,此中介軟體會成功設定「Server」標頭。但是,如果鏈中的任何其他處理程序也設定了“Server”標頭,則重複的標頭將導致回應。

出現挑戰是因為 ServeHTTP 明確禁止在要求完成後寫入 ResponseWriter。一種方法是建立自訂 ResponseWriter,攔截標頭寫入並在第一次寫入之前插入「Server」標頭。

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)
    })
}

透過使用自訂 ResponseWriter,我們可以確保新增「Server」標頭僅一次,無論其他處理程序的行為如何。這種方法引入了額外的間接層,但它保留了所需的功能。

以上是Go中介軟體如何可靠地控制HTTP頭而不重複?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn