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

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

このコミットは、Go言語の標準ライブラリである net/http パッケージから、いくつかの古くなった TODO コメントを削除するものです。具体的には、HTTPロギングに関するTODOと、HTTPレスポンスのヘッダーフィールドの振る舞いに関するTODOが対象となっています。これは、Goの設計思想の成熟と、特定の機能(ロギングなど)を標準ライブラリの範囲外に委ねるという決定を反映しています。

コミット

  • コミットハッシュ: b72325fde48f56dce438608b7d8375be1dc81080
  • 作者: Brad Fitzpatrick bradfitz@golang.org
  • 日付: 2013年4月4日 木曜日 13:40:26 -0700

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

https://github.com/golang/go/commit/b72325fde48f56dce438608b7d8375be1dc81080

元コミット内容

net/http: remove some obsolete TODOs

We've decided to leave logging to third-parties (there are too
many formats), which others have done.

And we can't change the behavior of the various response
fields at this point anyway. Plus I argue they're correct and
match their documention.

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/8391043

変更の背景

このコミットの背景には、Go言語の net/http パッケージの設計に関する重要な決定があります。

  1. ロギングの外部委託: コミットメッセージにあるように、GoチームはHTTPサーバーのロギング機能を標準ライブラリに組み込むのではなく、サードパーティのライブラリやユーザー自身の実装に委ねることを決定しました。これは、ロギングのフォーマットや要件が多岐にわたり、標準ライブラリで全てをカバーすることが困難であるという認識に基づいています。多くの既存のWebフレームワークやアプリケーションが独自のロギングメカニズムを持っているため、Goの net/http パッケージは、ロギングの柔軟性を確保するために、この領域をシンプルに保つことを選択しました。これにより、server.go にあったロギングに関する TODO コメントが不要になりました。

  2. HTTPレスポンスフィールドの安定性: response_test.go にあった ConnectionContent-LengthContentLength に関する TODO コメントは、これらのHTTPヘッダーやレスポンスフィールドの振る舞いについて、将来的な変更の可能性を示唆していました。しかし、コミットメッセージでは「この時点では様々なレスポンスフィールドの振る舞いを変更することはできない」と述べられており、さらに「それらは正しく、ドキュメントと一致している」と主張されています。これは、net/http パッケージが既に成熟し、これらのコアな振る舞いが安定しており、後方互換性を維持するために変更すべきではないという判断が下されたことを意味します。特に、ContentLength: -1 はHTTP/1.1のチャンク転送エンコーディングを示す標準的な方法であり、変更の必要がないと判断されました。

これらの決定は、Goの標準ライブラリが「シンプルさ」「堅牢性」「後方互換性」を重視する設計哲学を反映しています。

前提知識の解説

このコミットを理解するためには、以下の前提知識が役立ちます。

  • Go言語の net/http パッケージ: Go言語の標準ライブラリで、HTTPクライアントとサーバーの実装を提供します。Webアプリケーション開発の基盤となる非常に重要なパッケージです。
  • HTTPヘッダー: HTTPプロトコルにおいて、リクエストやレスポンスのメタデータを提供するキーと値のペアです。
    • Connection ヘッダー: クライアントとサーバー間の接続に関するオプションを制御します。例えば、Connection: close は、現在のトランザクションが完了した後に接続を閉じることを示します。
    • Content-Length ヘッダー: メッセージボディのバイト単位の長さを指定します。
  • チャンク転送エンコーディング (Chunked Transfer Encoding): HTTP/1.1で導入された転送エンコーディングの一種で、メッセージボディの長さを事前に知らなくても、動的にコンテンツを送信できるメカニズムです。各チャンクはサイズ情報とデータを含み、最後のチャンクはサイズ0で終了します。Goの net/http では、Response.ContentLength-1 の場合、チャンク転送が使用されることを示します。
  • TODO コメント: プログラミングにおいて、将来的に実装または修正が必要な箇所を示すためにコード内に残されるコメントです。通常、開発者が後で対応すべきタスクを追跡するために使用されます。
  • Goの設計哲学: Go言語は、シンプルさ、効率性、並行処理、そして堅牢な標準ライブラリを重視しています。標準ライブラリは、多くの一般的なタスクに対応できるように設計されていますが、同時に過度に複雑になることを避ける傾向があります。

技術的詳細

このコミットは、コードベースから「古くなった」と判断された TODO コメントを削除することで、net/http パッケージの設計意図を明確にしています。

  1. ロギングの非組み込み: src/pkg/net/http/server.go から // TODO(rsc): // logging というコメントが削除されました。これは、GoのHTTPサーバーが、Apache HTTP Serverのような組み込みのアクセスログ機能を持たないことを明確にしています。代わりに、ユーザーは http.Handler インターフェースをラップするミドルウェアを作成したり、io.Writer を利用して独自のロギングメカニズムを実装したりすることが期待されます。これにより、ユーザーはログのフォーマット、出力先、詳細度を自由に選択でき、Goの net/http パッケージはHTTPプロトコル処理というコア機能に集中できます。

  2. HTTPレスポンスフィールドの振る舞いの確定: src/pkg/net/http/response_test.go から削除された TODO コメントは、Response.Header 内の Connection および Content-Length ヘッダー、そして Response.ContentLength フィールドの振る舞いに関するものでした。

    • "Connection": {"close"}, // TODO(rsc): Delete?
    • "Content-Length": {"10"}, // TODO(rsc): Delete?
    • ContentLength: -1, // TODO(rsc): Fix? これらのコメントは、これらのフィールドが将来的に変更される可能性があるか、あるいは現在の実装に問題があるかもしれないという疑問を呈していました。しかし、コミットによってこれらの TODO が削除されたことは、Goチームがこれらの振る舞いを「正しい」と判断し、変更の必要がないと結論付けたことを示しています。 特に ContentLength: -1 は、HTTP/1.1のチャンク転送エンコーディングを使用する場合の標準的な表現であり、これはメッセージボディの長さが事前に不明な場合に非常に重要です。この振る舞いが安定していることは、net/http パッケージがHTTPプロトコルの仕様に忠実に従い、予測可能な動作を提供していることを保証します。

このコミットは、機能追加やバグ修正ではなく、コードベースの「クリーンアップ」と「設計意図の明確化」を目的としています。これにより、Goの net/http パッケージのAPIが安定しており、将来にわたって後方互換性が維持される可能性が高いというメッセージを開発者に送っています。

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

このコミットでは、以下の2つのファイルが変更されています。

  1. src/pkg/net/http/response_test.go

    • respTests 変数内のテストケースにおいて、Header フィールド内の ConnectionContent-Length ヘッダーに関する TODO(rsc): Delete? コメントが削除されました。
    • 同じく respTests 変数内の別のテストケースにおいて、ContentLength: -1 に関する TODO(rsc): Fix? コメントが削除されました。
    --- a/src/pkg/net/http/response_test.go
    +++ b/src/pkg/net/http/response_test.go
    @@ -112,8 +112,8 @@ var respTests = []respTest{
     			ProtoMinor: 0,
     			Request:    dummyReq("GET"),
     			Header: Header{
    -				"Connection":     {"close"}, // TODO(rsc): Delete?
    -				"Content-Length": {"10"},    // TODO(rsc): Delete?
    +				"Connection":     {"close"},
    +				"Content-Length": {"10"},
     			},
     			Close:         true,
     			ContentLength: 10,
    @@ -170,7 +170,7 @@ var respTests = []respTest{
     			Request:          dummyReq("GET"),
     			Header:           Header{},
     			Close:            false,
    -			ContentLength:    -1, // TODO(rsc): Fix?
    +			ContentLength:    -1,
     			TransferEncoding: []string{"chunked"},
     		},
    
  2. src/pkg/net/http/server.go

    • ファイル冒頭のコメントブロック内にあった、ロギングに関する TODO(rsc): // logging コメントが削除されました。
    --- a/src/pkg/net/http/server.go
    +++ b/src/pkg/net/http/server.go
    @@ -4,9 +4,6 @@
     
     // HTTP server.  See RFC 2616.
     
    -// TODO(rsc):
    -//	logging
    -
     package http
     
     import (
    

コアとなるコードの解説

このコミットのコード変更は非常にシンプルで、既存の TODO コメントを削除することに尽きます。

  • src/pkg/net/http/response_test.go の変更: response_test.gonet/http パッケージのHTTPレスポンス処理に関するテストが含まれています。削除された TODO コメントは、Connection ヘッダー、Content-Length ヘッダー、そして Response.ContentLength フィールドの振る舞いについて、将来的な変更や修正の可能性を示唆していました。これらのコメントが削除されたことは、Goチームがこれらの振る舞いを現在のままで「正しい」と判断し、変更の必要がないと結論付けたことを意味します。特に ContentLength: -1 は、チャンク転送エンコーディングを使用する際の標準的な表現であり、この振る舞いが安定していることが確認されました。

  • src/pkg/net/http/server.go の変更: server.gonet/http パッケージのHTTPサーバーの実装が含まれています。削除された // TODO(rsc): // logging コメントは、HTTPサーバーにロギング機能を組み込むことに関する将来の検討事項でした。このコメントが削除されたことで、Goの net/http パッケージは、ロギング機能を標準ライブラリの範囲外に置き、ユーザーやサードパーティライブラリに委ねるという設計方針が確定したことを示しています。これにより、net/http パッケージはHTTPプロトコル処理というコアな責務に集中し、ロギングの多様な要件に対応するための柔軟性をユーザーに提供します。

これらの変更は、コードの機能的な振る舞いを変更するものではなく、コードベースの「意図」と「将来の方向性」を明確にするためのクリーンアップ作業です。

関連リンク

参考にした情報源リンク

  • RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1 (特に Connection ヘッダー、Content-Length ヘッダー、チャンク転送エンコーディングに関するセクション)
  • Go言語の設計に関する議論やメーリングリストのアーカイブ (一般的なGoの設計哲学を理解するため)
  • Goの net/http パッケージのソースコード (変更前後の比較)