[インデックス 1959] ファイルの概要
このコミットは、Go言語の標準ライブラリsrc/lib/http/url.go内のURLUnescape関数のコメントにおける微細な修正に関するものです。具体的には、URLエンコードされた文字列をデコードする際の、不正な形式の%シーケンスに対するエラー条件の記述がより正確になるように変更されています。
コミット
commit 461fb39367b86414d59218676148a8d50f66c188
Author: Robert Griesemer <gri@golang.org>
Date: Thu Apr 2 23:26:55 2009 -0700
change in negation
R=rsc
DELTA=1 (0 added, 0 deleted, 1 changed)
OCL=27061
CL=27061
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/461fb39367b86414d59218676148a8d50f66c188
元コミット内容
change in negation
R=rsc
DELTA=1 (0 added, 0 deleted, 1 changed)
OCL=27061
CL=27061
変更の背景
このコミットは、URLUnescape関数のドキュメンテーションコメントにおける、エラー条件の記述をより正確にするためのものです。元々のコメントでは「each %(それぞれの%)が2つの16進数に続かない場合」と記述されていましたが、これは誤解を招く可能性がありました。実際には、URLエンコードされた文字列内に一つでも不正な%シーケンス(例えば%の後に16進数でない文字が続く、あるいは文字が続かないなど)が存在すれば、BadURLエラーが返されるべきです。
この変更は、コードの振る舞い自体を変更するものではなく、その振る舞いを説明するコメントの正確性を向上させることを目的としています。これは、APIの利用者にとって、どのような場合にエラーが発生するのかをより明確に理解してもらうために重要です。
前提知識の解説
URLエンコーディング (Percent-encoding)
URLエンコーディング(またはパーセントエンコーディング)は、URL内で特殊な意味を持つ文字(例: /, ?, &, =, %など)や、URLとして許可されていない文字(例: スペース、日本語文字など)を、安全にURLに含めるためのメカニズムです。これは、文字を%の後にその文字のASCII値またはUTF-8バイト列の16進数表現を続ける形式で置き換えることで行われます。
例:
- スペース (
) は%20にエンコードされます。 - 日本語の「あ」はUTF-8で
E3 81 82となるため、%E3%81%82のようにエンコードされます。
URLUnescape関数
URLUnescape関数は、このURLエンコードされた文字列を元の形式に戻す(デコードする)役割を担います。この関数は、%ABのようなシーケンスを見つけると、それを16進数ABに対応するバイト値に変換します。
os.Error (Go言語のエラーハンドリング)
Go言語では、エラーは通常、関数の戻り値としてerrorインターフェース型で返されます。このコミットが作成された2009年当時、Go言語のエラーインターフェースはos.Errorという名前でした(後にerrorに改名されました)。関数が正常に実行された場合はnilが返され、エラーが発生した場合はnilではないerror値が返されます。
URLUnescape関数は、入力文字列がURLエンコーディングの規則に従っていない場合にエラーを返します。例えば、%の後に有効な16進数ではない文字が続く場合や、%の後に文字が続かない場合などです。
技術的詳細
このコミットの技術的な変更点は非常に限定的で、src/lib/http/url.goファイル内のURLUnescape関数のドキュメンテーションコメントの1行のみです。
変更前:
// It returns a BadURL error if each % is not followed
変更後:
// It returns a BadURL error if any % is not followed
この変更は、「each %(それぞれの%)」という表現を「any %(いずれかの%)」に修正しています。
each %(変更前): この表現は、あたかもすべての%シーケンスが個別にチェックされ、そのうちのどれか一つでも不正であればエラーになる、というニュアンスにも取れますが、より厳密には「すべての%シーケンスが正しい形式でなければならない」という解釈も可能です。しかし、これは「一つでも不正なものがあればエラー」という実際の挙動を明確に示していません。any %(変更後): この表現は、「文字列内に存在する%シーケンスのうち、一つでも不正な形式のものがあれば、BadURLエラーが返される」という関数の実際の振る舞いをより正確に伝えます。これは、URLエンコーディングの仕様に違反する部分が文字列のどこか一箇所でも見つかれば、その文字列全体が不正であると判断されることを意味します。
この修正は、コードのロジック自体には影響を与えませんが、APIの契約(どのような入力に対してどのような出力やエラーを返すか)を説明する上で、より正確で誤解の余地のない記述を提供します。これは、Go言語のドキュメンテーションの品質と正確性に対する高い意識を示しています。
コアとなるコードの変更箇所
--- a/src/lib/http/url.go
+++ b/src/lib/http/url.go
@@ -43,7 +43,7 @@ func unhex(c byte) byte {
// URLUnescape unescapes a URL-encoded string,
// converting %AB into the byte 0xAB.
-// It returns a BadURL error if each % is not followed
+// It returns a BadURL error if any % is not followed
// by two hexadecimal digits.
func URLUnescape(s string) (string, *os.Error) {
// Count %, check that they're well-formed.
コアとなるコードの解説
変更されたのは、URLUnescape関数のシグネチャの直前にあるコメント行です。
元のコメント:
// It returns a BadURL error if each % is not followed
(それぞれの%が2つの16進数に続かない場合、BadURLエラーを返します)
変更後のコメント:
// It returns a BadURL error if any % is not followed
(いずれかの%が2つの16進数に続かない場合、BadURLエラーを返します)
この変更は、URLUnescape関数がURLエンコードされた文字列をデコードする際に、%の後に続くべき2つの16進数文字が欠けている、または不正な文字である場合にBadURLエラーを返すという挙動を説明しています。eachからanyへの変更は、文字列全体の中で一つでもそのような不正な%シーケンスが見つかればエラーとなる、という事実をより明確に表現しています。これは、関数のエラー条件に関するドキュメンテーションの正確性を高めるための、細かではあるが重要な改善です。
関連リンク
- Go言語の
net/urlパッケージ(現在のURLUnescape関数が含まれるパッケージ): https://pkg.go.dev/net/url - URLエンコーディングに関するRFC 3986: https://datatracker.ietf.org/doc/html/rfc3986
参考にした情報源リンク
- Go言語のコミット履歴 (GitHub): https://github.com/golang/go/commits/master
- Go言語のドキュメンテーション: https://go.dev/doc/
- URLエンコーディングに関する一般的な情報 (MDN Web Docsなど): https://developer.mozilla.org/ja/docs/Glossary/Percent-encoding
- Go言語のエラーハンドリングに関する情報: https://go.dev/blog/error-handling-and-go
- Go言語の初期の歴史に関する情報 (Robert Griesemer氏の貢献など): https://go.dev/doc/history
os.Errorからerrorへの変更に関する情報 (Go言語の進化): https://go.dev/doc/go1.0#errors