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

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

このコミットは、Go言語の標準ライブラリ net/http パッケージ内の transport.go ファイルに対する変更です。具体的には、connectMethod のキャッシュキーフォーマットに関するコメントの修正が行われています。このファイルは、HTTPクライアントがネットワーク接続を確立し、リクエストを送信し、レスポンスを受信する際の低レベルな詳細を処理する Transport 型の実装を含んでいます。

コミット

net/http: fix comment in connectMethod's key format

このコミットは、net/http パッケージ内の transport.go ファイルにおけるコメントの誤りを修正するものです。connectMethod のキャッシュキーフォーマットに関する説明が、実際のフォーマットと一致するように更新されました。

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

https://github.com/golang/go/commit/4228092b2c2ab92e0a1ef05d1f0a93179d1266d5

元コミット内容

commit 4228092b2c2ab92e0a1ef05d1f0a93179d1266d5
Author: Anfernee Yongkun Gui <anfernee.gui@gmail.com>
Date:   Sun Feb 23 21:18:41 2014 -0800

    net/http: fix comment in connectMethod's key format
    
    LGTM=bradfitz
    R=golang-codereviews, bradfitz
    CC=golang-codereviews
    https://golang.org/cl/66990045
---
 src/pkg/net/http/transport.go | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/pkg/net/http/transport.go b/src/pkg/net/http/transport.go
index 2c312a77a0..5655d704f7 100644
--- a/src/pkg/net/http/transport.go
+++ b/src/pkg/net/http/transport.go
@@ -615,8 +615,8 @@ func useProxy(addr string) bool {
 //
 // Cache key form                Description
 // -----------------             -------------------------\n-// ||http|foo.com                http directly to server, no proxy\n-// ||https|foo.com               https directly to server, no proxy\n+// |http|foo.com                 http directly to server, no proxy\n+// |https|foo.com                https directly to server, no proxy\n // http://proxy.com|https|foo.com  http to proxy, then CONNECT to foo.com\n // http://proxy.com|http           http to proxy, http to anywhere after that\n //

変更の背景

このコミットの背景は、net/http パッケージの Transport 型が内部的に使用する接続キャッシュのキーフォーマットに関するコメントの誤りを修正することにあります。Transport は、HTTPリクエストの効率的な処理のために、確立されたTCP接続を再利用する「接続プール」または「接続キャッシュ」を管理します。このキャッシュは、同じ宛先への後続のリクエストで新しい接続を確立するオーバーヘッドを避けるために重要です。

コメントは、キャッシュキーの形式を説明するためのものでしたが、特定のケース(プロキシを使用しない直接接続)におけるキーのプレフィックスが誤って || と記述されていました。実際のコードでは | が使用されており、このコメントの不一致が開発者の混乱を招く可能性がありました。このコミットは、ドキュメントと実装の整合性を保ち、コードの可読性と理解度を向上させることを目的としています。

前提知識の解説

このコミットを理解するためには、以下の前提知識が必要です。

  • Go言語の net/http パッケージ: Go言語の標準ライブラリであり、HTTPクライアントとサーバーの実装を提供します。クライアント側では、http.Client がHTTPリクエストを送信するための高レベルなインターフェースを提供し、その内部で http.Transport が実際のネットワーク通信を処理します。
  • http.Transport: http.Transport は、HTTPリクエストのラウンドトリップ(リクエストの送信からレスポンスの受信まで)を処理する構造体です。これには、TCP接続の確立、TLSハンドシェイク、HTTP/1.1およびHTTP/2のプロトコル処理、そして**接続の再利用(接続プーリング/キャッシュ)**の管理が含まれます。
  • 接続プーリング/キャッシュ: HTTP/1.1では、複数のリクエストで同じTCP接続を再利用する「持続的接続(Persistent Connections)」がサポートされています。http.Transport は、この持続的接続を管理するための内部キャッシュ(プール)を持っています。これにより、新しいTCP接続を確立する際のオーバーヘッド(TCPスリーウェイハンドシェイク、TLSハンドシェイクなど)を削減し、HTTP通信のパフォーマンスを向上させます。
  • キャッシュキー: 接続キャッシュでは、どの接続を再利用できるかを識別するために「キー」が使用されます。このキーは、接続先のホスト、ポート、プロトコル(HTTP/HTTPS)、プロキシ情報など、接続の特性を一意に識別する情報から生成されます。このコミットで修正されたコメントは、このキャッシュキーのフォーマットに関する説明でした。
  • HTTP CONNECTメソッド: HTTPプロキシサーバーを介してTLS接続を確立する際に使用されるHTTPメソッドです。クライアントはプロキシに対して CONNECT リクエストを送信し、プロキシは指定された宛先へのTCP接続を確立し、その接続をクライアントにトンネルします。これにより、クライアントと最終的なサーバー間でTLSハンドシェイクを直接行うことができます。

技術的詳細

src/pkg/net/http/transport.go ファイル内の connectMethod は、http.Transport が内部的に接続を管理する際に使用される概念です。特に、プロキシを介した接続や直接接続など、異なる接続方法を区別するために利用されます。

このコミットで修正されたコメントブロックは、Transport が内部的に接続をキャッシュする際に使用するキーの形式を説明しています。このキーは、Transport が既存のアイドル状態の接続を再利用できるかどうかを判断するために重要です。

修正前のコメントは以下のようになっていました。

// Cache key form                Description
// -----------------             -------------------------
// ||http|foo.com                http directly to server, no proxy
// ||https|foo.com               https directly to server, no proxy
// http://proxy.com|https|foo.com  http to proxy, then CONNECT to foo.com
// http://proxy.com|http           http to proxy, http to anywhere after that

ここで問題となっていたのは、最初の2行、つまり「プロキシを使用しない直接接続」の場合のキャッシュキーの記述です。||http|foo.com||https|foo.com と記述されていましたが、実際のGoの net/http の実装では、これらのキーは |http|foo.com および |https|foo.com の形式で生成されます。つまり、プロトコル名の前にパイプ記号 (|) が一つだけ付与されます。

このコメントの修正は、ドキュメントとコードの間の不整合を解消し、将来のGo開発者が net/http パッケージの内部動作を理解する際の混乱を防ぐことを目的としています。このような小さなコメントの修正であっても、大規模なコードベースでは非常に重要であり、コードの正確な理解を助け、デバッグや機能追加の際の誤解を減らすことに貢献します。

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

変更は src/pkg/net/http/transport.go ファイルの以下の行にあります。

--- a/src/pkg/net/http/transport.go
+++ b/src/pkg/net/http/transport.go
@@ -615,8 +615,8 @@ func useProxy(addr string) bool {
 //
 // Cache key form                Description
 // -----------------             -------------------------\n-// ||http|foo.com                http directly to server, no proxy\n-// ||https|foo.com               https directly to server, no proxy\n+// |http|foo.com                 http directly to server, no proxy\n+// |https|foo.com                https directly to server, no proxy\n // http://proxy.com|https|foo.com  http to proxy, then CONNECT to foo.com\n // http://proxy.com|http           http to proxy, http to anywhere after that\n //

具体的には、||http|foo.com|http|foo.com に、||https|foo.com|https|foo.com に変更されています。

コアとなるコードの解説

このコミットは、Goの net/http パッケージの Transport 型が内部的に使用する接続キャッシュのキーフォーマットに関するコメントの修正です。

Transport は、HTTPリクエストを効率的に処理するために、確立されたTCP接続を再利用する接続プールを管理します。この接続プールは、同じ宛先への後続のリクエストで新しい接続を確立するオーバーヘッドを避けるために重要です。

接続をキャッシュする際、Transport は接続の特性(プロトコル、ホスト、ポート、プロキシ情報など)に基づいて一意の「キー」を生成します。このキーは、既存のアイドル状態の接続を再利用できるかどうかを判断するために使用されます。

修正されたコメントは、このキャッシュキーの形式を説明するものでした。特に、プロキシを使用しない直接接続の場合のキーの形式について、以前は ||http|foo.com||https|foo.com と記述されていましたが、これは誤りでした。実際のGoのコードでは、これらのキーは |http|foo.com および |https|foo.com の形式で生成されます。つまり、プロトコル名の前にパイプ記号 (|) が一つだけ付与されます。

この修正は、コードの動作自体を変更するものではなく、あくまでその動作を説明するコメントの正確性を向上させるものです。これにより、net/http パッケージの内部実装を理解しようとする開発者が、誤った情報に基づいて解釈することを防ぎ、コードの可読性と保守性を高めます。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント
  • GitHubのgolang/goリポジトリのコミット履歴
  • HTTPプロトコルに関する一般的な知識
  • TCP/IPネットワークに関する一般的な知識
  • TLS/SSLに関する一般的な知識
  • Goのコードレビュープロセスに関する情報 (LGTM, R, CCなどの意味)
  • GoのCL (Change List) システムに関する情報 (https://golang.org/cl/66990045)