外部 Go ミドルウェアからの HTTP ヘッダーのオーバーライド
バックグラウンド
Go のミドルウェアは次の目的で使用されます。リクエストとレスポンスがハンドラーに到達する前にインターセプトして変更します。ただし、複数のミドルウェア コンポーネントが同じヘッダーを変更すると、そのヘッダーの複数のインスタンスが応答に設定される可能性があります。
次のミドルウェアの例を考えてみましょう。
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」ヘッダーが生成されます。 response.
Custom ResponseWriter
この問題を解決するには、WriteHeader() 呼び出しをインターセプトし、リクエストをさらに渡す前に適切なヘッダーを設定するカスタム ResponseWriter を作成できます。 .
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() }
サーバー ミドルウェアでこのカスタム ResponseWriter を使用することで、次のことを保証できます。 「Server」ヘッダーは 1 回だけ設定されます。
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) }) }
このソリューションにより、ServeHTTP のセマンティクスに違反することなく、外部ミドルウェアから HTTP ヘッダーを制御できます。
以上がGo ミドルウェアで HTTP ヘッダーを重複せずにオーバーライドする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。