ホームページ >バックエンド開発 >Golang >golang http ResponseWriter が 2kb を超えないのに、コンテンツの長さが自動的に追加されるのはなぜですか?

golang http ResponseWriter が 2kb を超えないのに、コンテンツの長さが自動的に追加されるのはなぜですか?

WBOY
WBOY転載
2024-02-09 08:28:02591ブラウズ

如果 golang http ResponseWriter 不超过 2kb,为什么会自动添加内容长度

php エディタの Xinyi が golang に関する質問に答えます。ResponseWriter のコンテンツが 2kb を超えない場合、http リクエストの処理時にコンテンツの長さが自動的に追加されるのはなぜですか?実際、これは、HTTP プロトコルではコンテンツの長さが必須フィールドであり、応答を正しく解析するために受信するデータの長さをクライアントに伝えるために使用されるためです。コンテンツの長さが短い場合でも、完全な通信プロセスを保証するためにサーバーはこのフィールドを提供する必要があります。このようにして、クライアントはコンテンツを正しく受信して解析でき、リクエストと応答の整合性と正確性が保証されます。

質問内容

func (handler Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    var content string
    ...
    w.Write([]byte(content))
}

len(content) content-length が応答に自動的に追加されます。また、2048 を超える場合は、content-length がなく、transfer-encoding: chunked が追加されます。

2048年をどこで判断するのかわかりません。

2048年が決定されているソースコードを見つけるのに協力を求めています。

解決策

http.responsewriterインターフェイスでこの関数のドキュメントを見てみましょう。参考のみとしてください。明確さ:

[i] 書き込まれたすべてのデータの合計サイズが数 kb 未満で、フラッシュ呼び出しがない場合、content-length ヘッダーが自動的に追加されます。

まず、この番号は正確に 2048 (2 kb) ではない可能性がありますが、予想される「数 kb」の範囲内であることがわかります。次に、この動作は flush メソッドに関連していることがわかります。これは、flusher インターフェイスに文書化されています。

flush は、バッファされたすべてのデータをクライアントに送信します。

フラッシャー インターフェイスは、responsewriter によって実装され、http ハンドラーがバッファされたデータをクライアントにフラッシュできるようにします。

デフォルトの http/1.x および http/2 レスポンスライター実装はフラッシャーをサポートしますが、レスポンスライター ラッパーはサポートしない場合があります。ハンドラーは実行時に常にこの機能をテストする必要があります。

文字通り、

responsewriter はデータのバッファリングとフラッシュをサポートしている可能性があります。これは、応答ライターにデータを書き込んだときに、そのデータが接続経由ですぐには転送されないことを意味します。代わりに、最初にバッファに書き込まれます。バッファーがいっぱいになって書き込みができなくなるたびに、servehttp メソッドが返されるときにバッファー全体が転送されます。これにより、小さな書き込みを多数行った場合でも、データが効率的に転送され、最終的にはすべてのデータが転送されることが保証されます。 flush メソッドを使用して、いつでも積極的にバッファをクリアすることを選択することもできます。 http ヘッダーは本文データの前に送信する必要がありますが、バッファーが最初に空になる前に送信する必要はありません。

これらすべてをまとめると、書き込まれた合計量がバッファ サイズを超えず、

flush を呼び出さなかった場合、すべてのデータの準備が整うまでヘッダーを送信する必要がないことがわかります。 , この時点で、コンテンツの長さがわかります。書き込まれた合計量がバッファ サイズより大きい場合は、コンテンツの長さが判明する前にヘッダーを送信する必要があるため、responsewriter はコンテンツの長さを自動的に判断できません。

これは

net/http/server.go にあります。具体的には、バッファ サイズと chunkedwriter の宣言を次に示します。 リーリー

1.19.5

のソース コード リンク。 Go のバージョンごとにソースコードが変更される可能性があることに注意してください。

以上がgolang http ResponseWriter が 2kb を超えないのに、コンテンツの長さが自動的に追加されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。