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

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

このコミットは、Go言語の標準ライブラリ net/http パッケージ内の Client 構造体のドキュメンテーションを更新するものです。具体的には、ClientTransport フィールドと CheckRedirect フィールドに関するコメントがより詳細かつ明確になるように修正されています。

コミット

commit f44304ee634ce8f97a0000b72dafba4fdbdf46b1
Author: Brad Fitzpatrick <bradfitz@golang.org>
Date:   Wed Jan 18 19:05:53 2012 -0800

    net/http: update the Client docs a bit
    
    R=golang-dev, dsymonds, adg
    CC=golang-dev
    https://golang.org/cl/5557058

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

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

元コミット内容

net/http: update the Client docs a bit

変更の背景

このコミットの背景は、net/http パッケージの Client 構造体に関するドキュメンテーションの明確化と改善です。特に、ClientTransport フィールドと CheckRedirect フィールドの役割と動作について、より詳細な説明が必要とされたため、ドキュメントが更新されました。これにより、Client を利用する開発者がこれらの重要なフィールドの挙動を正確に理解し、適切に利用できるようになることが目的です。

前提知識の解説

Go言語の net/http パッケージ

net/http パッケージは、Go言語でHTTPクライアントおよびサーバーを実装するための標準ライブラリです。このパッケージは、HTTPリクエストの送信、レスポンスの受信、HTTPサーバーの構築など、HTTP通信に関する基本的な機能を提供します。

http.Client 構造体

http.Client は、HTTPリクエストを送信し、HTTPレスポンスを受信するための高レベルなインターフェースを提供する構造体です。クッキー、リダイレクト、コネクションプーリングなどの詳細を自動的に処理します。Client インスタンスは、内部状態(キャッシュされたTCPコネクションなど)を持つため、必要に応じて作成するのではなく、再利用することが推奨されます。また、複数のゴルーチンによる並行利用に対しても安全です。

RoundTripper インターフェース

RoundTripper は、単一のHTTPトランザクション(リクエストの送信とレスポンスの受信)を実行するためのメカニズムを定義するインターフェースです。その定義は以下の通りです。

type RoundTripper interface {
    RoundTrip(*Request) (*Response, error)
}

RoundTrip メソッドは *http.Request を受け取り、*http.Response とエラーを返します。これは実際のHTTP通信を行うコアコンポーネントであり、http.Client はその Transport フィールド(http.RoundTripper 型)を使用してリクエストを実行します。

  • 目的: HTTP通信の実際の処理を担当します。
  • デフォルト実装: http.ClientTransport フィールドが nil の場合、http.DefaultTransport が使用されます。これは、コネクションプーリング、プロキシ処理、TLS設定を含む標準的なHTTP/HTTPSトランスポートを提供します。
  • カスタマイズとミドルウェア: RoundTripper インターフェースは、HTTPリクエストにカスタムロジック(ミドルウェア)を実装するために非常に重要です。デフォルトのトランスポートや他のカスタム RoundTripper をラップすることで、以下のようなことが可能です。
    • リクエストが送信される前に変更を加える(例: ヘッダーの追加、ロギング)。
    • レスポンスが受信された後に検査または変更を加える(例: ロギング、エラーハンドリング)。
    • リトライ、キャッシング、認証などの機能を実装する。

CheckRedirect フィールド

http.ClientCheckRedirect フィールドは、クライアントのリダイレクトポリシーを制御する関数です。そのシグネチャは以下の通りです。

CheckRedirect func(req *Request, via []*Request) error

この関数は、HTTPリダイレクトレスポンス(例: 301, 302, 303, 307, 308)が受信された後に呼び出されます。

  • req: リダイレクトターゲットに送信される新しい Request

  • via: 現在の req を除く、リダイレクトチェーンで既に行われたリクエストを表す *Request オブジェクトのスライス。

  • 目的: リダイレクトの処理にカスタムロジックを定義できます。

    • CheckRedirectnil を返すと、クライアントはリダイレクトに従います。
    • CheckRedirect がエラーを返すと、クライアントはリダイレクトの追跡を停止し、そのエラーが呼び出し元に返されます。
    • 特殊なケース: CheckRedirecthttp.ErrUseLastResponse を返すと、クライアントはリダイレクトの追跡を停止しますが、受信した最新の *http.Response(リダイレクトレスポンス自体)を nil エラーとともに返し、リダイレクトレスポンスを検査できるようにします。
  • デフォルトの挙動: CheckRedirectnil の場合、http.Client はデフォルトポリシーを使用し、最大10回連続でリダイレクトを自動的に追跡します。

技術的詳細

このコミットは、net/http/client.go ファイル内の Client 構造体の定義におけるコメントを修正しています。

変更前は、Transport フィールドのコメントが簡潔で、Client 全体に対する一般的なコメントとして「Client is not yet very configurable.」という記述がありました。

変更後では、Transport フィールドのコメントがより詳細になり、その役割が明確に記述されています。 // Transport specifies the mechanism by which individual // HTTP requests are made. // If nil, DefaultTransport is used. これにより、Transport が個々のHTTPリクエストを行うメカニズムを定義し、nil の場合は DefaultTransport が使用されることが明示されます。

また、CheckRedirect フィールドに対するコメントが追加され、その役割が明確に説明されています。 // CheckRedirect specifies the policy for handling redirects. // If CheckRedirect is not nil, the client calls it before // following an HTTP redirect. The arguments req and via // are the upcoming request and the requests made already, これにより、CheckRedirect がリダイレクト処理のポリシーを定義し、nil でない場合にクライアントがリダイレクトを追跡する前に呼び出されること、そして reqvia 引数の意味が説明されています。

これらの変更は、コードの動作自体を変更するものではなく、コードの可読性と理解度を向上させるためのドキュメンテーションの改善です。特に、Client 構造体の重要な設定ポイントである TransportCheckRedirect について、開発者がより正確な情報を得られるようになります。

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

diff --git a/src/pkg/net/http/client.go b/src/pkg/net/http/client.go
index 3d36f30e32..1d70672695 100644
--- a/src/pkg/net/http/client.go
+++ b/src/pkg/net/http/client.go
@@ -24,11 +24,13 @@ import (
 // The Client's Transport typically has internal state (cached
 // TCP connections), so Clients should be reused instead of created as
 // needed. Clients are safe for concurrent use by multiple goroutines.
-//
-// Client is not yet very configurable.
 type Client struct {
-	Transport RoundTripper // if nil, DefaultTransport is used
+	// Transport specifies the mechanism by which individual
+	// HTTP requests are made.
+	// If nil, DefaultTransport is used.
+	Transport RoundTripper
 
+	// CheckRedirect specifies the policy for handling redirects.
 	// If CheckRedirect is not nil, the client calls it before
 	// following an HTTP redirect. The arguments req and via
 	// are the upcoming request and the requests made already,

コアとなるコードの解説

このコミットでは、src/pkg/net/http/client.go ファイル内の http.Client 構造体の定義が変更されています。

  1. Transport フィールドのコメントの変更:

    • 変更前: Transport RoundTripper // if nil, DefaultTransport is used
    • 変更後:
      // Transport specifies the mechanism by which individual
      // HTTP requests are made.
      // If nil, DefaultTransport is used.
      Transport RoundTripper
      

    これにより、Transport フィールドの役割がより詳細に説明されています。単に「nilの場合DefaultTransportが使われる」という情報だけでなく、「個々のHTTPリクエストが行われるメカニズムを指定する」という本質的な役割が明記されました。

  2. Client 構造体全体のコメントの削除:

    • 変更前には Client is not yet very configurable. というコメントがありましたが、これは削除されました。これは、Goの進化とともに Client がより設定可能になったことを示唆しているか、あるいはこのコメントが特定のフィールドのドキュメントとしては適切でないと判断されたためと考えられます。
  3. CheckRedirect フィールドのコメントの追加:

    • 変更前には CheckRedirect フィールドに対するコメントがありませんでした。
    • 変更後:
      // CheckRedirect specifies the policy for handling redirects.
      // If CheckRedirect is not nil, the client calls it before
      // following an HTTP redirect. The arguments req and via
      // are the upcoming request and the requests made already,
      

    この追加により、CheckRedirect フィールドの目的と動作が明確に説明されています。リダイレクト処理のポリシーを定義し、リダイレクトを追跡する前に呼び出されること、そしてコールバック関数に渡される引数 reqvia の意味が示されています。

これらの変更は、http.Client のAPIドキュメンテーションを改善し、開発者がこれらの重要な設定オプションをより効果的に利用できるようにすることを目的としています。

関連リンク

参考にした情報源リンク