github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/net/http/client.go (about)

     1  // Copyright 2009 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // HTTPクライアント。RFC 7230から7235を参照してください。
     6  //
     7  // これは高レベルのClientインターフェースです。
     8  // 低レベルの実装はtransport.goにあります。
     9  
    10  package http
    11  
    12  import (
    13  	"github.com/shogo82148/std/errors"
    14  	"github.com/shogo82148/std/io"
    15  	"github.com/shogo82148/std/net/url"
    16  	"github.com/shogo82148/std/time"
    17  )
    18  
    19  // ClientはHTTPクライアントです。ゼロ値([DefaultClient])は、[DefaultTransport] を使用する使用可能なクライアントです。
    20  //
    21  // [Client.Transport] には通常、内部状態(キャッシュされたTCP接続など)があるため、必要に応じて作成するのではなく、再利用する必要があります。
    22  // Clientsは、複数のゴルーチンによる同時使用に対して安全です。
    23  //
    24  // Clientは、[RoundTripper]([Transport] など)よりも高レベルであり、クッキーやリダイレクトなどのHTTPの詳細も処理します。
    25  //
    26  // リダイレクトに従う場合、Clientは、初期 [Request] に設定されたすべてのヘッダーを転送しますが、以下の場合は除外されます。
    27  //
    28  //   - "Authorization"、"WWW-Authenticate"、および"Cookie"などの機密ヘッダーを、信頼できないターゲットに転送する場合。
    29  //     これらのヘッダーは、初期ドメインのサブドメインマッチまたは完全一致でないドメインにリダイレクトする場合は無視されます。
    30  //     たとえば、"foo.com"から"foo.com"または"sub.foo.com"にリダイレクトする場合は、機密ヘッダーが転送されますが、
    31  //     "bar.com"にリダイレクトする場合は転送されません。
    32  //   - 非nilのCookie Jarで"Cookie"ヘッダーを転送する場合。
    33  //     各リダイレクトはCookie Jarの状態を変更する可能性があるため、初期リクエストで設定されたCookieを変更する可能性があります。
    34  //     "Cookie"ヘッダーを転送する場合、変更されたCookieは省略され、Jarが更新された値で変更されたCookieを挿入することが期待されます(元のドメインが一致する場合)。
    35  //     Jarがnilの場合、初期Cookieは変更せずに転送されます。
    36  type Client struct {
    37  	// Transportは個別のHTTPリクエストが行われるメカニズムを指定します。
    38  	// nilの場合、DefaultTransportが使用されます。
    39  	Transport RoundTripper
    40  
    41  	// CheckRedirectはリダイレクトの処理ポリシーを指定します。
    42  	// CheckRedirectがnilでない場合、クライアントはHTTPリダイレクトに従う前にそれを呼び出します。
    43  	// 引数のreqとviaは、直前のリクエストとこれまでに行われたリクエストです。最も古いものから順に渡されます。
    44  	// CheckRedirectがエラーを返す場合、ClientのGetメソッドはリクエストreqを発行せずに、
    45  	// 前のResponse(そのBodyが閉じられている)とCheckRedirectのエラー(url.Errorでラップされたもの)の両方を返します。
    46  	// 特別な場合として、CheckRedirectがErrUseLastResponseを返す場合、
    47  	// 最新のレスポンスがそのBodyが閉じていない状態で返され、エラーはnilです。
    48  	//
    49  	// CheckRedirectがnilの場合、Clientはデフォルトのポリシーを使用します。
    50  	// デフォルトのポリシーは、連続した10個のリクエストの後に停止することです。
    51  	CheckRedirect func(req *Request, via []*Request) error
    52  
    53  	// Jarはクッキージャーを指定します。
    54  	//
    55  	// Jarは、出力リクエストに関連するクッキーを挿入するために使用され、
    56  	// すべての入力レスポンスのクッキー値で更新されます。
    57  	// Jarは、クライアントがフォローするすべてのリダイレクトで参照されます。
    58  	//
    59  	// Jarがnilの場合、リクエストに明示的に設定されていない場合にのみクッキーが送信されます。
    60  	Jar CookieJar
    61  
    62  	// Timeoutは、このClientによって行われるリクエストのタイムアウト時間を指定します。
    63  	// タイムアウトには、接続時間、リダイレクト、レスポンスボディの読み取りなどが含まれます。
    64  	// Get、Head、Post、またはDoが返却された後でも、タイマーは実行し続け、
    65  	// Response.Bodyの読み取りを中断します。
    66  	//
    67  	// Timeoutがゼロの場合は、タイムアウトはありません。
    68  	//
    69  	// Clientは、RequestのContextが終了した場合と同様に、
    70  	// ベースとなるTransportへのリクエストをキャンセルします。
    71  	//
    72  	// 互換性のために、ClientはTransportにCancelRequestメソッドも使用しますが、
    73  	// 新しいRoundTripperの実装はCancelRequestではなく、
    74  	// リクエストのContextを使用してキャンセルするべきです。
    75  	Timeout time.Duration
    76  }
    77  
    78  // DefaultClientはデフォルトの [Client] であり、[Get]、[Head]、および [Post] に使用されます。
    79  var DefaultClient = &Client{}
    80  
    81  // RoundTripperは、指定された [Request] に対する [Response] を取得するための単一のHTTPトランザクションを実行する能力を表すインターフェースです。
    82  //
    83  // RoundTripperは、複数のゴルーチンによる同時使用に対して安全である必要があります。
    84  type RoundTripper interface {
    85  	RoundTrip(*Request) (*Response, error)
    86  }
    87  
    88  // ErrSchemeMismatchは、サーバーがHTTPSクライアントにHTTPレスポンスを返した場合に返されます。
    89  var ErrSchemeMismatch = errors.New("http: server gave HTTP response to HTTPS client")
    90  
    91  // Getは、指定されたURLにGETを発行します。レスポンスが次のリダイレクトコードの1つである場合、
    92  // Getはリダイレクトに従います。最大10回のリダイレクトまで:
    93  //
    94  //	301(Moved Permanently)
    95  //	302(Found)
    96  //	303(See Other)
    97  //	307(Temporary Redirect)
    98  //	308(Permanent Redirect)
    99  //
   100  // リダイレクトが多すぎる場合や、HTTPプロトコルエラーがあった場合はエラーが返されます。
   101  // 非2xxレスポンスはエラーを引き起こしません。
   102  // 任意の返されたエラーは [*url.Error] 型です。url.ErrorのTimeoutメソッドは、
   103  // リクエストがタイムアウトした場合にtrueを報告します。
   104  //
   105  // errがnilの場合、respには常に非nilのresp.Bodyが含まれます。
   106  // 呼び出し元は、resp.Bodyの読み取りが完了したらresp.Bodyを閉じる必要があります。
   107  //
   108  // Getは、DefaultClient.Getのラッパーです。
   109  //
   110  // カスタムヘッダーでリクエストを作成するには、[NewRequest] とDefaultClient.Doを使用します。
   111  //
   112  // 指定されたcontext.Contextでリクエストを作成するには、[NewRequestWithContext] とDefaultClient.Doを使用します。
   113  func Get(url string) (resp *Response, err error)
   114  
   115  // Getは指定されたURLにGETを発行します。レスポンスが以下のリダイレクトコードのいずれかである場合、
   116  // Getは [Client.CheckRedirect] 関数を呼び出した後にリダイレクトを追跡します:
   117  //
   118  //	301 (Moved Permanently)
   119  //	302 (Found)
   120  //	303 (See Other)
   121  //	307 (Temporary Redirect)
   122  //	308 (Permanent Redirect)
   123  //
   124  // [Client.CheckRedirect] 関数が失敗した場合、またはHTTPプロトコルエラーがあった場合、エラーが返されます。
   125  // 非2xxのレスポンスはエラーを引き起こしません。返される任意のエラーは [*url.Error] 型になります。
   126  // url.Error値のTimeoutメソッドは、リクエストがタイムアウトした場合にtrueを報告します。
   127  //
   128  // errがnilの場合、respは常に非nilのresp.Bodyを含みます。
   129  // 読み取りが完了したら、呼び出し元はresp.Bodyを閉じる必要があります。
   130  //
   131  // カスタムヘッダーを使用してリクエストを行うには、[NewRequest] と [Client.Do] を使用します。
   132  //
   133  // カスタムヘッダーでリクエストを行うには、[NewRequest] と
   134  // [Client.Do] を使用します。
   135  //
   136  // 指定したcontext.Contextでリクエストを作成するには、[NewRequestWithContext] と Client.Do を使用します。
   137  func (c *Client) Get(url string) (resp *Response, err error)
   138  
   139  // ErrUseLastResponseは、Client.CheckRedirectフックによって返され、リダイレクトの処理方法を制御するために使用できます。
   140  // これが返されると、次のリクエストは送信されず、最も最近のレスポンスがそのボディが閉じられていない状態で返されます。
   141  var ErrUseLastResponse = errors.New("net/http: use last response")
   142  
   143  // DoはHTTPリクエストを送信し、クライアントの設定したポリシー(リダイレクト、クッキー、認証など)に従ってHTTPレスポンスを返します。
   144  //
   145  // クライアントポリシー(CheckRedirectなど)によってトリガーされた場合、またはHTTP転送が失敗した場合(ネットワーク接続の問題など)、エラーが返されます。2xx以外のステータスコードはエラーを引き起こしません。
   146  //
   147  // 返されるエラーがnilの場合、[Response] にはユーザーが閉じなければならない非nilのBodyが含まれます。
   148  // BodyがEOFまで完全に読み取られずに閉じられない場合、[Client] の基本となる [RoundTripper](通常は [Transport])は、
   149  // 次の「keep-alive」リクエストのためにサーバーへの永続的なTCP接続を再利用できないかもしれません。
   150  //
   151  // リクエストのBodyがnilでない場合、それは基本となるTransportによって閉じられます。エラーが発生した場合も同様です。
   152  //
   153  // エラーが発生した場合、任意のResponseは無視できます。非nilのResponseと非nilのエラーは、CheckRedirectが失敗した場合にのみ返されます。その場合でも、返された [Response.Body] はすでに閉じられています。
   154  //
   155  // 通常、Doの代わりに [Get]、[Post]、または [PostForm] が使用されます。
   156  //
   157  // サーバーがリダイレクトを返すと、Clientは最初にCheckRedirect関数を使用してリダイレクトをフォローするかどうかを決定します。許可されると、301、302、または303のリダイレクトは、メソッドがGET(元のリクエストがHEADだった場合はHEAD)でボディがない後続のリクエストを引き起こします。307または308のリダイレクトは、[Request.GetBody] 関数が定義されている場合、元のHTTPメソッドとボディを保持します。[NewRequest] 関数は、一般的な標準ライブラリボディタイプのGetBodyを自動的に設定します。
   158  //
   159  // すべての返されるエラーは [*url.Error] 型です。url.ErrorのTimeoutメソッドは、リクエストがタイムアウトした場合にtrueを報告します。
   160  func (c *Client) Do(req *Request) (*Response, error)
   161  
   162  // Postは、指定されたURLに対してPOSTメソッドを送信します。
   163  //
   164  // 呼び出し元は、resp.Bodyの読み込みが完了したらresp.Bodyを閉じる必要があります。
   165  //
   166  // もし提供されたBodyが [io.Closer] を実装している場合は、リクエストの後で閉じられます。
   167  //
   168  // Postは、DefaultClient.Postのラッパーです。
   169  //
   170  // カスタムヘッダーを設定するには、[NewRequest] と DefaultClient.Doを使用します。
   171  //
   172  // リダイレクトの処理方法については、[Client.Do] メソッドのドキュメントを参照してください。
   173  //
   174  // 指定されたcontext.Contextでリクエストを作成するには、[NewRequestWithContext] とDefaultClient.Doを使用します。
   175  func Post(url, contentType string, body io.Reader) (resp *Response, err error)
   176  
   177  // Postは、指定されたURLにPOSTリクエストを送信します。
   178  //
   179  // 呼び出し元は、resp.Bodyの読み込みが完了したらresp.Bodyを閉じる必要があります。
   180  //
   181  // 提供されたBodyが [io.Closer] インターフェースを実装している場合、リクエストの後に閉じられます。
   182  //
   183  // カスタムヘッダーを設定するには、[NewRequest] と [Client.Do] を使用します。
   184  //
   185  // 指定されたcontext.Contextでリクエストを作成するには、[NewRequestWithContext] と [Client.Do] を使用します。
   186  //
   187  // リダイレクトの処理方法については、Client.Doメソッドのドキュメントを参照してください。
   188  func (c *Client) Post(url, contentType string, body io.Reader) (resp *Response, err error)
   189  
   190  // PostFormは、データのキーと値がURLエンコードされたリクエストボディとして指定されたURLにPOSTを発行します。
   191  //
   192  // Content-Typeヘッダーはapplication/x-www-form-urlencodedに設定されます。
   193  // 他のヘッダーを設定するには、[NewRequest] とDefaultClient.Doを使用します。
   194  //
   195  // errがnilの場合、respには常に非nilのresp.Bodyが含まれます。
   196  // 呼び出し元は、resp.Bodyの読み取りが完了したらresp.Bodyを閉じる必要があります。
   197  //
   198  // PostFormは、DefaultClient.PostFormのラッパーです。
   199  //
   200  // リダイレクトの処理方法については、[Client.Do] メソッドのドキュメントを参照してください。
   201  //
   202  // 指定された [context.Context] でリクエストを作成するには、[NewRequestWithContext] とDefaultClient.Doを使用します。
   203  func PostForm(url string, data url.Values) (resp *Response, err error)
   204  
   205  // PostForm関数は、指定されたデータのキーと値のペアをリクエストボディにエンコードして、URLにPOSTリクエストを送信します。
   206  //
   207  // Content-Typeヘッダーはapplication/x-www-form-urlencodedに設定されます。
   208  // 他のヘッダーを設定するには、[NewRequest] と [Client.Do] を使用します。
   209  //
   210  // errがnilの場合、respは常に非nilのresp.Bodyを含みます。
   211  // 読み取り後、呼び出し元はresp.Bodyを閉じなければなりません。
   212  //
   213  // リダイレクトの処理については、Client.Doメソッドのドキュメンテーションを参照してください。
   214  //
   215  // 指定したcontext.Contextでリクエストを作成するには、[NewRequestWithContext] とClient.Doを使用します。
   216  func (c *Client) PostForm(url string, data url.Values) (resp *Response, err error)
   217  
   218  // Headは、指定されたURLに対してHEADリクエストを発行します。レスポンスが以下のリダイレクトコードのいずれかである場合、
   219  // Headはリダイレクションをフォローします。最大10回のリダイレクトが許可されます:
   220  //
   221  //	301 (Moved Permanently)
   222  //	302 (Found)
   223  //	303 (See Other)
   224  //	307 (Temporary Redirect)
   225  //	308 (Permanent Redirect)
   226  //
   227  // HeadはDefaultClient.Headのラッパーです。
   228  //
   229  // 指定した [context.Context] でリクエストを作成するには、[NewRequestWithContext] と DefaultClient.Do を使用します。
   230  func Head(url string) (resp *Response, err error)
   231  
   232  // 指定されたURLにHEADリクエストを送信します。もしレスポンスが以下のいずれかのリダイレクトコードである場合、
   233  // Headメソッドはリダイレクトに従う前に [Client.CheckRedirect] 関数を呼び出すことがあります。
   234  //
   235  //	301 (Moved Permanently)
   236  //	302 (Found)
   237  //	303 (See Other)
   238  //	307 (Temporary Redirect)
   239  //	308 (Permanent Redirect)
   240  //
   241  // 指定された [context.Context] を使用してリクエストを送信する場合は、[NewRequestWithContext] と [Client.Do] を使用してください。
   242  func (c *Client) Head(url string) (resp *Response, err error)
   243  
   244  // CloseIdleConnectionsは、以前は接続されていたが現在は"keep-alive"状態、つまりアイドル状態にある [Transport] 上のアイドル接続を閉じます。
   245  // これは現在アクティブな接続を中断しません。
   246  //
   247  // [Client.Transport] に [Client.CloseIdleConnections] メソッドがない場合、このメソッドは何もしません。
   248  func (c *Client) CloseIdleConnections()