[インデックス 15365] ファイルの概要
このコミットは、Go言語の標準ライブラリ net/url パッケージにおける URL 構造体の Opaque フィールドに関するドキュメントの修正です。特に、クライアントリクエストを作成する際に Opaque フィールドをどのように使用すべきかについての注記を明確にすることを目的としています。
コミット
commit 0462aad9a485d1df06ea935d7f9d1044a29ad746
Author: Brad Fitzpatrick <bradfitz@golang.org>
Date: Thu Feb 21 14:39:16 2013 -0800
net/url: fix URL Opaque notes on making client requests
Fixes #4860
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/7375047
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/0462aad9a485d1df06ea935d7f9d1044a29ad746
元コミット内容
net/url: fix URL Opaque notes on making client requests
このコミットは、net/url パッケージの URL 構造体における Opaque フィールドに関する注記を修正し、クライアントリクエストを作成する際の正しい使用方法を明確にすることを目的としています。
変更の背景
このコミットは、GoのIssue #4860「net/url: URL.Opaque のドキュメントは、クライアントリクエストの作成方法について誤解を招く可能性がある」を修正するために行われました。
元のドキュメントでは、URL{Opaque: "/Go%2f"} のような例が示されていましたが、これはホスト情報を含まないため、HTTPクライアントが外部リソースにリクエストを送信する際には不完全でした。HTTPクライアントがリクエストを送信するためには、通常、ホスト情報が必要です。Opaque フィールドは、スキーム固有の階層的でない部分(例: mailto:user@example.com の user@example.com)や、パスがエンコードされた形式で厳密に扱われるべき場合に使用されます。しかし、HTTPリクエストの文脈では、ホスト情報が欠落していると、クライアントがどのサーバーに接続すべきかを判断できません。
この問題は、URL 構造体の Opaque フィールドのドキュメントが、特にHTTPクライアントがリクエストを構築する際の具体的な例において、誤解を招く可能性があったために発生しました。Opaque フィールドは、URLのパス部分がエンコードされた形式でそのまま扱われるべき場合に利用されますが、HTTPリクエストにおいては、通常 Host フィールドも適切に設定されている必要があります。元の例では Host フィールドが省略されており、これが混乱の原因となっていました。
前提知識の解説
URL (Uniform Resource Locator)
URLは、インターネット上のリソースの位置を示す統一リソース識別子 (URI) の一種です。一般的なURLは、以下のコンポーネントで構成されます。
- スキーム (Scheme): リソースにアクセスするためのプロトコル(例:
http,https,ftp,mailto)。 - ユーザー情報 (User Info): ユーザー名とパスワード(通常は省略される)。
- ホスト (Host): リソースが配置されているサーバーのドメイン名またはIPアドレス。
- ポート (Port): サーバー上の特定のサービスを識別する番号(通常はスキームのデフォルトポートが使用されるため省略される)。
- パス (Path): サーバー上のリソースの階層的な位置。
- クエリ (Query): リソースに渡される追加のパラメータ。
- フラグメント (Fragment): リソース内の特定の部分を指す識別子。
Go言語の net/url パッケージ
Go言語の net/url パッケージは、URLの解析と構築のための機能を提供します。このパッケージの中心となるのが URL 構造体です。
type URL struct {
Scheme string
Opaque string // encoded opaque data
User *Userinfo // username and password information
Host string // host or host:port
Path string // path (relative paths may omit leading slash)
RawPath string // encoded path hint (see EscapedPath method)
ForceQuery bool // append a query ('?') even if RawQuery is empty
RawQuery string // encoded query values, without '?'
Fragment string // fragment for references, without '#'
}
URL 構造体の Opaque フィールドと Path フィールド
Pathフィールド: これはURLの階層的なパス部分を表します。例えば、http://example.com/foo/barの場合、Pathは/foo/barとなります。Pathフィールドは、通常、URLエンコード/デコードの規則に従って処理されます。Opaqueフィールド: このフィールドは、URLのスキーム固有の部分が階層的でない場合、またはその部分がエンコードされた形式でそのまま扱われるべき場合に利用されます。例えば、mailto:user@example.comの場合、Opaqueはuser@example.comとなります。Opaqueが設定されている場合、Path、RawPath、RawQuery、ForceQuery、Fragmentフィールドは無視され、URLの文字列表現はSchemeとOpaqueの組み合わせ(例:scheme:opaque)になります。
Opaque フィールドは、主に mailto: や urn: のようなスキームで、URLのパス部分が階層構造を持たない場合や、エンコードされた形式をそのまま保持したい場合に設計されています。HTTP/HTTPSのような階層的なURLでは、通常 Path フィールドが使用されます。
技術的詳細
このコミットの技術的なポイントは、net/url パッケージの URL 構造体の Opaque フィールドのドキュメントが、HTTPクライアントがリクエストを構築する際の具体的な例において、誤解を招く可能性があった点を修正したことです。
元のドキュメントの例:
an HTTP client can use URL{Opaque: "/Go%2f"} instead of URL{Path: "/Go/"}.
この例は、Opaque フィールドに /Go%2f を設定することで、パスがエンコードされた形式で扱われることを示唆していますが、HTTPクライアントが実際にリクエストを送信するためには、どのホストに接続すべきかという情報(Host フィールド)が不可欠です。Opaque フィールドは、URLのスキーム固有の部分が階層的でない場合(例: mailto:user@example.com)や、パスがエンコードされた形式で厳密に扱われるべき場合に利用されます。しかし、HTTPリクエストの文脈では、ホスト情報が欠落していると、クライアントがどのサーバーに接続すべきかを判断できません。
修正後のドキュメントの例:
an HTTP client can use URL{Host: "example.com", Opaque: "//example.com/Go%2f"} instead of URL{Host: "example.com", Path: "/Go/"}.
この修正により、Host フィールドが明示的に追加され、HTTPクライアントがリクエストを送信する際に必要な情報がすべて揃うようになりました。また、Opaque フィールドの値も //example.com/Go%2f となり、これは URL 構造体の String() メソッドが Opaque フィールドをどのように処理するか(scheme:opaque の形式)を考慮したものです。HTTP URLの場合、Opaque フィールドに //host/path の形式で値を設定することで、URL.String() が http://host/path のような形式を生成するようになります。
この変更は、Opaque フィールドの本来の意図と、HTTPクライアントがURLを構築する際の現実的な要件との間のギャップを埋めるものです。Opaque は、URLのパス部分がエンコードされた形式でそのまま扱われるべき場合に利用されますが、HTTPリクエストにおいては、通常 Host フィールドも適切に設定されている必要があります。この修正は、開発者が net/url パッケージをより正確に、かつ意図した通りに使用できるようにするための重要なドキュメント改善です。
コアとなるコードの変更箇所
変更は src/pkg/net/url/url.go ファイルの1箇所のみです。
--- a/src/pkg/net/url/url.go
+++ b/src/pkg/net/url/url.go
@@ -225,7 +225,8 @@ func escape(s string, mode encoding) string {
// slashes in the raw URL and which were %2f. This distinction is rarely important,
// but when it is a client must use other routines to parse the raw URL or construct
// the parsed URL. For example, an HTTP server can consult req.RequestURI, and
-// an HTTP client can use URL{Opaque: "/Go%2f"} instead of URL{Path: "/Go/"}.
+// an HTTP client can use URL{Host: "example.com", Opaque: "//example.com/Go%2f"}\n+// instead of URL{Host: "example.com", Path: "/Go/"}.
type URL struct {
Scheme string
Opaque string // encoded opaque data
具体的には、URL 構造体の Opaque フィールドに関するコメントが以下のように変更されました。
- 変更前:
an HTTP client can use URL{Opaque: "/Go%2f"} instead of URL{Path: "/Go/"}. - 変更後:
an HTTP client can use URL{Host: "example.com", Opaque: "//example.com/Go%2f"} instead of URL{Host: "example.com", Path: "/Go/"}.
コアとなるコードの解説
この変更は、net/url パッケージの URL 構造体のドキュメントコメントを修正するものです。
元のコメントでは、HTTPクライアントが Opaque フィールドを使用してURLを構築する例として URL{Opaque: "/Go%2f"} が挙げられていました。しかし、HTTPリクエストを送信する際には、通常、どのホストにリクエストを送信するかを示す Host フィールドが必要です。Opaque フィールドは、URLのスキーム固有の部分が階層的でない場合(例: mailto: スキーム)や、パスがエンコードされた形式でそのまま扱われるべき場合に利用されます。HTTPのような階層的なURLでは、Opaque を使用する場合でも、ホスト情報が適切に設定されている必要があります。
修正後のコメントでは、URL{Host: "example.com", Opaque: "//example.com/Go%2f"} という例が示されています。これにより、HTTPクライアントが Opaque フィールドを使用する際に、Host フィールドも適切に設定する必要があることが明確になります。また、Opaque フィールドの値が //example.com/Go%2f となっているのは、URL 構造体の String() メソッドが Opaque フィールドをどのように処理するか(scheme:opaque の形式)を考慮したものです。HTTP URLの場合、Opaque フィールドに //host/path の形式で値を設定することで、URL.String() が http://host/path のような形式を生成するようになります。
この修正は、Opaque フィールドのドキュメントをより正確にし、開発者がHTTPクライアントで net/url パッケージを扱う際の混乱を避けることを目的としています。これにより、Opaque フィールドの本来の意図と、HTTPクライアントがURLを構築する際の現実的な要件との間のギャップが埋められます。
関連リンク
- GitHubコミットページ: https://github.com/golang/go/commit/0462aad9a485d1df06ea935d7f9d1044a29ad746
- Go CL (Code Review): https://golang.org/cl/7375047
- Go Issue #4860:
net/url:URL.Opaqueのドキュメントは、クライアントリクエストの作成方法について誤解を招く可能性がある (検索結果に基づく推測)
参考にした情報源リンク
- Go Issue #4860 (検索結果に基づく): https://github.com/golang/go/issues/4860
- Go
net/urlパッケージドキュメント: https://pkg.go.dev/net/url - RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax: https://datatracker.ietf.org/doc/html/rfc3986
- Go
URL構造体のString()メソッドの挙動に関する情報 (一般的なGoのURL処理に関する知識)