このシナリオでは、既存のサーバー ヘッダーをオーバーライドするために使用する Go ミドルウェア Server があります。カスタム値。ただし、リクエスト チェーンの下のいずれかのハンドラーが w.Header().Add("Server", "foo") を呼び出すと、応答に複数の Server ヘッダーが含まれます。
意図された動作は、Server を持つことです。ミドルウェアは、他のすべてのヘッダーが書き込まれた後でのみ、そのヘッダー値を追加します。ただし、ServeHTTP のセマンティクスでは、呼び出しが完了する前にヘッダーを書き込む必要があると規定されています。
回避策の 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 サイトの他の関連記事を参照してください。