ホームページ >バックエンド開発 >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 があります。カスタム値。ただし、リクエスト チェーンの下のいずれかのハンドラーが w.Header().Add("Server", "foo") を呼び出すと、応答に複数の Server ヘッダーが含まれます。

意図された動作は、Server を持つことです。ミドルウェアは、他のすべてのヘッダーが書き込まれた後でのみ、そのヘッダー値を追加します。ただし、ServeHTTP のセマンティクスでは、呼び出しが完了する前にヘッダーを書き込む必要があると規定されています。

カスタム ResponseWriter の使用

回避策の 1 つは、すべてのヘッダー書き込みをインターセプトしてサーバーを挿入するカスタム 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)
    })
}

このソリューションにより、リクエスト チェーンのヘッダーがいつ、どこに追加されるかに関係なく、サーバー ヘッダーが適切なタイミングで追加されます。

さらに詳しい情報については、次を参照してください。 https://kev.inburke.com/kevin/how-to-write-go-middleware/.

以上がGo ミドルウェアはサーバー ヘッダーの重複を防ぐために HTTP ヘッダーをどのように制御できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。