ホームページ >バックエンド開発 >Golang >Go ミドルウェアで HTTP ヘッダーを効果的に制御するにはどうすればよいですか?

Go ミドルウェアで HTTP ヘッダーを効果的に制御するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-29 06:47:13862ブラウズ

How to Effectively Control HTTP Headers in Go Middleware?

外部 Go ミドルウェアによる HTTP ヘッダーの制御

問題: ミドルウェアでのサーバー ヘッダーのオーバーライド

Go にミドルウェアがあるシナリオに直面しています。カスタムの「Server」ヘッダーを設定しようとします。ただし、アプリケーションまたは他のミドルウェアによって設定された既存の「サーバー」ヘッダーは存続するため、応答に複数の「サーバー」ヘッダーが含まれます。

許可されないヘッダー変更

HTTP セマンティクスに従って、応答ヘッダーを変更します。 ServeHTTP メソッドが戻った後は禁止されています。この制限は、リクエストの処理とレスポンスの最終処理の間に明確な境界を確立することを目的としています。

提案されたソリューション

1.カスタム ResponseWriter:

ヘッダー変更操作をインターセプトするカスタム ResponseWriter ラッパーを定義します。ヘッダーを書き込む前に、ラッパーはカスタムの「Server」ヘッダーを挿入します。このアプローチでは、追加の間接層が追加されますが、ヘッダー管理をきめ細かく制御できます。

カスタム 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:

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

2.ミドルウェア順序の逆転:

別のアプローチは、「サーバー」ヘッダー設定ミドルウェアが他のすべてのミドルウェアの後に実行されるように、ミドルウェアの順序を逆転することです。これにより、ヘッダーの変更が応答が完了する前の最後の操作になることが保証されます。

3.最内ミドルウェア:

可能であれば、「サーバー」ヘッダー設定ミドルウェアをミドルウェアの最内層として配置します。これにより、外部ミドルウェアが「Server」ヘッダーを設定した後にそれを変更する可能性が排除されます。

4.応答の変更:

最後の手段として、応答をインターセプトし、それに応じて「Server」ヘッダーを変更するカスタム http.Handler の使用を検討できます。このアプローチでは、アプリケーションの他の機能を壊さないように慎重に扱う必要があります。

以上がGo ミドルウェアで HTTP ヘッダーを効果的に制御するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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