ホームページ > バックエンド開発 > Golang > Go ミドルウェアで HTTP ヘッダーを重複せずにオーバーライドする方法

Go ミドルウェアで HTTP ヘッダーを重複せずにオーバーライドする方法

Barbara Streisand
リリース: 2024-12-03 16:29:11
オリジナル
496 人が閲覧しました

How to Override HTTP Headers in Go Middleware Without Duplication?

外部 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート