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

     1  // Copyright 2016 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  // パッケージhttptraceは、HTTPクライアントリクエスト内のイベントをトレースするメカニズムを提供します。
     6  package httptrace
     7  
     8  import (
     9  	"github.com/shogo82148/std/context"
    10  	"github.com/shogo82148/std/crypto/tls"
    11  	"github.com/shogo82148/std/net"
    12  	"github.com/shogo82148/std/net/textproto"
    13  	"github.com/shogo82148/std/time"
    14  )
    15  
    16  // ContextClientTraceは与えられたコンテキストに関連付けられた [ClientTrace] を返します。関連付けられていない場合はnilを返します。
    17  func ContextClientTrace(ctx context.Context) *ClientTrace
    18  
    19  // WithClientTraceは提供された親コンテキストに基づいた新しいコンテキストを返します。返されたコンテキストを使用して行われるHTTPクライアントリクエストは、以前のフックに加えて、提供されたトレースフックを使用します。提供されたトレースで定義されたフックは最初に呼び出されます。
    20  func WithClientTrace(ctx context.Context, trace *ClientTrace) context.Context
    21  
    22  // ClientTraceは、送信中のHTTPリクエストのさまざまなステージで実行するためのフックのセットです。特定のフックはnilである場合があります。関数は複数のゴルーチンから同時に呼び出されることがあり、一部の関数はリクエストが完了または失敗した後に呼び出されることがあります。
    23  // 現在、ClientTraceは単一のHTTPリクエストとレスポンスをトレースし、リダイレクトされたリクエストのシリーズを対象とするフックはありません。
    24  // 詳細については、https://blog.golang.org/http-tracingを参照してください。
    25  type ClientTrace struct {
    26  	// GetConnは、接続が作成される前またはアイドルプールから取得される前に呼び出されます。hostPortは、対象またはプロキシの"ホスト:ポート"です。GetConnは、すでにアイドルキャッシュされた接続が利用可能である場合でも呼び出されます。
    27  	GetConn func(hostPort string)
    28  
    29  	// GotConnは、成功した接続後に呼び出されます。
    30  	// 接続の取得に失敗した場合のフックはありません。代わりに、Transport.RoundTripからのエラーを使用してください。
    31  	GotConn func(GotConnInfo)
    32  
    33  	// PutIdleConnは接続がアイドルプールに返されたときに呼び出されます。
    34  	// errがnilの場合、接続は正常にアイドルプールに返されました。
    35  	// errが非nilの場合、なぜ正常に返されなかったかを説明します。
    36  	// Transport.DisableKeepAlivesによって、接続再利用が無効化されている場合、PutIdleConnは呼び出されません。
    37  	// PutIdleConnは呼び出し元のResponse.Body.Close呼び出しの前に呼び出されます。
    38  	// HTTP/2では、このフックは現在使用されていません。
    39  	PutIdleConn func(err error)
    40  
    41  	// GotFirstResponseByteは、レスポンスヘッダーの最初のバイトが利用可能な場合に呼び出されます。
    42  	GotFirstResponseByte func()
    43  
    44  	// Got100Continue はサーバーが「100 Continue」の応答を返した場合に呼び出されます。
    45  	Got100Continue func()
    46  
    47  	// Got1xxResponseは、最終的な非1xxレスポンス前に返される1xx情報レスポンスヘッダーごとに呼び出されます。
    48  	// Got1xxResponseは、「100 Continue」レスポンスに対しても、Got100Continueが定義されている場合でも呼び出されます。
    49  	// エラーを返すと、そのエラー値でクライアントリクエストが中止されます。
    50  	Got1xxResponse func(code int, header textproto.MIMEHeader) error
    51  
    52  	// DNSStart はDNSの検索が始まった時に呼び出されます。
    53  	DNSStart func(DNSStartInfo)
    54  
    55  	// DNSDoneはDNSの検索が終了した時に呼び出されます。
    56  	DNSDone func(DNSDoneInfo)
    57  
    58  	// ConnectStart は新しい接続のダイヤルが開始された時に呼び出されます。
    59  	// net.Dialer.DualStack (IPv6 "Happy Eyeballs") サポートが有効になっている場合、これは複数回呼び出されるかもしれません。
    60  	ConnectStart func(network, addr string)
    61  
    62  	// ConnectDone は新しい接続の Dial が完了すると呼び出されます。
    63  	// 提供された err は接続が成功したかどうかを示します。
    64  	// net.Dialer.DualStack ("Happy Eyeballs") サポートが有効な場合、これは複数回呼び出される可能性があります。
    65  	ConnectDone func(network, addr string, err error)
    66  
    67  	// TLSHandshakeStartはTLSハンドシェイクが開始されたときに呼び出されます。HTTPプロキシを介してHTTPSサイトに接続する場合、ハンドシェイクはプロキシによってCONNECTリクエストが処理された後に行われます。
    68  	TLSHandshakeStart func()
    69  
    70  	// TLSHandshakeDoneは、TLSハンドシェイクが成功した場合、またはハンドシェイクが失敗した場合に、成功したハンドシェイクの接続状態、またはハンドシェイクエラーのいずれかを受け取った後に呼び出される。
    71  	TLSHandshakeDone func(tls.ConnectionState, error)
    72  
    73  	// WroteHeaderField は、Transport が各リクエストヘッダーを書き込んだ後に呼び出されます。この呼び出し時点では、値はバッファリングされており、まだネットワークに書き込まれていない可能性があります。
    74  	WroteHeaderField func(key string, value []string)
    75  
    76  	// WroteHeaders は、Transport がすべてのリクエストヘッダを書き込んだ後に呼び出されます。
    77  	WroteHeaders func()
    78  
    79  	// Wait100Continue は、リクエストが "Expect: 100-continue" を指定し、
    80  	// トランスポートがリクエストヘッダーを書き込みましたが、
    81  	// リクエストボディを書き込む前にサーバーから "100 Continue" を待っている場合に呼び出されます。
    82  	Wait100Continue func()
    83  
    84  	// WroteRequestは、リクエストと任意のボディの書き込み結果が渡されたときに呼び出されます。再試行される場合には複数回呼び出されることがあります。
    85  	WroteRequest func(WroteRequestInfo)
    86  }
    87  
    88  // WroteRequestInfoはWroteRequestフックに提供される情報を含んでいます。
    89  type WroteRequestInfo struct {
    90  	// Err はリクエストの書き込み中に遭遇したエラーです。
    91  	Err error
    92  }
    93  
    94  // DNSStartInfoはDNSリクエストに関する情報を含んでいます。
    95  type DNSStartInfo struct {
    96  	Host string
    97  }
    98  
    99  // DNSDoneInfoはDNS検索の結果に関する情報を含んでいます。
   100  type DNSDoneInfo struct {
   101  
   102  	// AddrsにはDNSの検索で見つかったIPv4と/またはIPv6のアドレスが含まれます。
   103  	// スライスの内容は変更しないでください。
   104  	Addrs []net.IPAddr
   105  
   106  	// ErrはDNSルックアップ中に発生したエラーです。
   107  	Err error
   108  
   109  	// Coalescedは、同時にDNSルックアップを行っていた別の呼び出し元とAddrsが共有されていたかどうかを示す。
   110  	Coalesced bool
   111  }
   112  
   113  // GotConnInfoは [ClientTrace.GotConn] 関数の引数であり、
   114  // 取得した接続に関する情報を含んでいます。
   115  type GotConnInfo struct {
   116  
   117  	// Connは取得された接続です。これはhttp.Transportによって所有されており、ClientTraceのユーザーは読み書きやクローズを行ってはいけません。
   118  	Conn net.Conn
   119  
   120  	// Reusedは、この接続が以前に別のHTTPリクエストで使用されたかどうかを示す。
   121  	Reused bool
   122  
   123  	// WasIdleはこのコネクションがアイドルプールから取得されたかどうかを示します。
   124  	WasIdle bool
   125  
   126  	// WasIdleがtrueの場合、IdleTimeは接続が前回アイドル状態だった時間を示します。
   127  	IdleTime time.Duration
   128  }