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

[インデックス 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への変更は、文字列全体の中で一つでもそのような不正な%シーケンスが見つかればエラーとなる、という事実をより明確に表現しています。これは、関数のエラー条件に関するドキュメンテーションの正確性を高めるための、細かではあるが重要な改善です。

関連リンク

参考にした情報源リンク