首頁 >後端開發 >Golang >Go中間件如何控制HTTP頭來防止伺服器頭重複?

Go中間件如何控制HTTP頭來防止伺服器頭重複?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-21 03:28:14528瀏覽

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

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

在這種情況下,您有一個Go 中間件Server,您想用它來覆蓋任何現有的Server 標頭自訂值。但是,如果請求鏈下游的任何處理程序呼叫 w.Header().Add("Server", "foo"),則會導致回應中出現多個 Server 標頭。

預期的行為是讓 Server中間件僅在寫入所有其他標頭後才附加其標頭值。但是,ServeHTTP 的語意規定必須在呼叫完成之前寫入標頭。

使用自訂 ResponseWriter

一種解決方法是建立一個自訂 ResponseWriter 來攔截所有標頭寫入並插入伺服器就在所有標頭被刷新之前。以下是範例:

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()
}
注意:此方法需要額外的間接層。

更新的伺服器中間件

更新的伺服器中間件可以利用此自訂ResponseWriter:

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

此解決方案可確保在適當的時間添加Server 標頭,無論何時何地在請求鏈中添加標頭。

更多見解,您可以參考https://kev.inburke.com/kevin/how-to-write-go-middleware/。

以上是Go中間件如何控制HTTP頭來防止伺服器頭重複?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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