Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 15963] ファイルの概要

このコミットは、Go言語の標準ライブラリ net/textproto パッケージにおいて、HTTPヘッダーの共通リストに「Cookie」ヘッダーを追加する変更です。これにより、net/textproto がHTTP通信において「Cookie」ヘッダーを適切に処理できるようになります。

コミット

commit 8eaa94293388848485093c3f0c65b1188dccaaea
Author: Brad Fitzpatrick <bradfitz@golang.org>
Date:   Tue Mar 26 23:08:08 2013 -0700

    net/textproto: add "Cookie" to the common headers list
    
    Seems to have been omitted before.
    
    R=golang-dev, dave
    CC=golang-dev
    https://golang.org/cl/7749049

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/8eaa94293388848485093c3f0c65b1188dccaaea

元コミット内容

net/textproto: add "Cookie" to the common headers list

Seems to have been omitted before.

変更の背景

この変更の背景は、net/textproto パッケージ内の共通ヘッダーリスト commonHeaders から「Cookie」ヘッダーが以前から漏れていたという認識に基づいています。HTTP通信において「Cookie」ヘッダーは非常に重要な役割を果たすため、このリストに含まれていないことは、パッケージの機能性や互換性に影響を与える可能性がありました。開発者であるBrad Fitzpatrick氏がこの見落としに気づき、修正のためにコミットされました。これにより、net/textproto を利用するアプリケーションが、HTTPリクエスト/レスポンスにおけるCookie情報をより適切に扱えるようになります。

前提知識の解説

Go言語の net/textproto パッケージ

net/textproto パッケージは、Go言語の標準ライブラリの一部であり、テキストベースのネットワークプロトコル(HTTP、SMTP、NNTPなど)を解析するための低レベルな機能を提供します。このパッケージは、ヘッダーの読み込み、行の読み込み、MIMEパートの解析など、プロトコルに依存しない汎用的なテキスト処理機能を提供します。HTTPのような複雑なプロトコルを扱う net/http パッケージは、内部で net/textproto を利用してヘッダーの解析などを行っています。

HTTPヘッダー

HTTPヘッダーは、HTTPリクエストまたはレスポンスのメッセージボディに関する追加情報を提供するキーと値のペアです。これらはクライアントとサーバー間で通信されるメタデータであり、コンテンツタイプ、認証情報、キャッシュ制御、そして今回の主題であるCookie情報など、多岐にわたる情報を含みます。

Cookieヘッダー

「Cookie」ヘッダーは、HTTPリクエストヘッダーの一つで、クライアント(ブラウザなど)がサーバーに送信するCookie情報を含みます。Cookieは、ウェブサイトがユーザーのブラウザに保存する小さなデータ片であり、セッション管理、ユーザーのパーソナライズ、トラッキングなどに利用されます。サーバーは Set-Cookie レスポンスヘッダーを通じてCookieをクライアントに設定し、クライアントは以降のリクエストでそのCookieを「Cookie」リクエストヘッダーとしてサーバーに送り返します。

commonHeaders リストの役割

net/textproto パッケージ内部には、commonHeaders と呼ばれる文字列のスライス(配列)が存在します。このリストは、HTTPヘッダーの中でも特に頻繁に出現するヘッダー名を事前に定義しておくことで、ヘッダーの解析処理を最適化するために使用されます。具体的には、ヘッダー名をこのリストと照合することで、文字列の比較処理を高速化したり、特定のヘッダーに対する特別な処理を効率的に適用したりすることが可能になります。

技術的詳細

このコミットの技術的な詳細は、net/textproto パッケージがヘッダーを解析する際の内部的な最適化メカニズムに焦点を当てています。net/textprotoReader 型は、ネットワークストリームからヘッダーを読み取る際に、効率的な処理のために commonHeaders リストを利用します。

ヘッダーを読み込む際、net/textproto はまず受信したヘッダー名を commonHeaders リスト内の既知のヘッダー名と比較します。もし一致するヘッダー名が見つかれば、そのヘッダーは「共通ヘッダー」として認識され、特定の最適化されたパスで処理される可能性があります。例えば、ヘッダー名の正規化(大文字・小文字の区別をなくすなど)や、特定のヘッダーに対する事前定義された処理ロジックの適用などが考えられます。

「Cookie」ヘッダーが commonHeaders リストに含まれていなかった場合、net/textproto はそれを「未知のヘッダー」として扱い、より汎用的な(そしておそらくはわずかに遅い)パスで処理することになります。これは機能的な問題を引き起こすわけではありませんが、パフォーマンスの観点から見れば最適ではありませんでした。特に、Cookieはウェブアプリケーションにおいて非常に頻繁に使用されるヘッダーであるため、その処理が最適化されていないことは、大規模なウェブサービスや高負荷な環境において無視できない影響を与える可能性がありました。

このコミットによって「Cookie」が commonHeaders に追加されたことで、net/textproto は「Cookie」ヘッダーを他の一般的なヘッダー(例: Content-Type, Date など)と同様に効率的に処理できるようになります。これにより、HTTP通信におけるCookieの解析と利用がよりスムーズになり、net/http パッケージを介してウェブアプリケーションを開発する際の基盤が強化されます。

コアとなるコードの変更箇所

変更は src/pkg/net/textproto/reader.go ファイルの1箇所のみです。

--- a/src/pkg/net/textproto/reader.go
+++ b/src/pkg/net/textproto/reader.go
@@ -574,6 +574,7 @@ var commonHeaders = []string{
 	"Content-Length",
 	"Content-Transfer-Encoding",
 	"Content-Type",
+	"Cookie",
 	"Date",
 	"Dkim-Signature",
 	"Etag",

具体的には、commonHeaders という文字列スライスに "Cookie" という文字列が1行追加されています。

コアとなるコードの解説

変更されたコードは、net/textproto パッケージ内で定義されている commonHeaders というグローバル変数です。これは []string 型のスライスであり、HTTPヘッダー名を文字列として保持しています。

このスライスは、net/textproto の内部でヘッダーを解析する際に、既知のヘッダー名を効率的に識別するために使用されます。ヘッダーを読み込む際、受信したヘッダー名がこの commonHeaders リストに含まれているかどうかをチェックすることで、文字列の比較処理を最適化したり、特定のヘッダーに対する特別な処理を適用したりします。

今回の変更では、この commonHeaders リストに "Cookie" が追加されました。これにより、net/textproto はHTTPリクエスト/レスポンスから「Cookie」ヘッダーを読み取る際に、他の一般的なヘッダーと同様に効率的に処理できるようになります。これは、特にウェブアプリケーションにおいて頻繁に利用されるCookieの処理性能向上に寄与します。

関連リンク

参考にした情報源リンク

  • Go言語 net/textproto パッケージのドキュメント: https://pkg.go.dev/net/textproto
  • HTTP Cookieに関するMDN Web Docs: https://developer.mozilla.org/ja/docs/Web/HTTP/Cookies
  • HTTPヘッダーに関するMDN Web Docs: https://developer.mozilla.org/ja/docs/Web/HTTP/Headers
  • Go言語の commonHeaders (または commonHeader) は、net/textproto パッケージ内でMIMEヘッダーキーの正規化を最適化するために使用される内部の非公開マップです。これはパッケージの外部ユーザーが直接使用するものではありません。
  • net/textproto パッケージは、キーを値のセットにマッピングするMIMEスタイルのヘッダーを表す MIMEHeader 型を提供します。また、ハイフンの後の最初の文字と任意の文字を大文字に、残りを小文字に変換することで、MIMEヘッダーキーの正規形式を返す CanonicalMIMEHeaderKey 関数も提供します(例:「accept-encoding」は「Accept-Encoding」になります)。