...

パッケージ httptrace

import "net/http/httptrace"
概要
目次

概要 ▾

httptrace パッケージは, HTTP クライアントリクエストにおけるイベントを追跡する機構を提供します。

コード:

req, _ := http.NewRequest("GET", "http://example.com", nil)
trace := &httptrace.ClientTrace{
    GotConn: func(connInfo httptrace.GotConnInfo) {
        fmt.Printf("Got Conn: %+v\n", connInfo)
    },
    DNSDone: func(dnsInfo httptrace.DNSDoneInfo) {
        fmt.Printf("DNS Info: %+v\n", dnsInfo)
    },
}
req = req.WithContext(httptrace.WithClientTrace(req.Context(), trace))
_, err := http.DefaultTransport.RoundTrip(req)
if err != nil {
    log.Fatal(err)
}

func WithClientTrace 1.7

func WithClientTrace(ctx context.Context, trace *ClientTrace) context.Context

WithClientTrace は,指定された親 ctx に基づいて新しいコンテキストを返します。 返されたコンテキストで行われた HTTP クライアントリクエストは, ctx に登録された以前のフックに加えて,渡されたトレースフックを使用します。 渡されたトレースで定義されているフックはすべて最初に呼び出されます。

type ClientTrace 1.7

ClientTrace は,発信 HTTP リクエストのさまざまな段階で実行される一連のフックです。 どんな特定のフックもゼロであるかもしれません。 関数は異なるゴルーチンから平行に呼び出されるかもしれませんし,リクエストが完了または失敗した後に呼び出されるかもしれません。

ClientTrace は現在, 1 つのラウンドトリップ中に 1 つの HTTP リクエストとレスポンスを追跡し,一連のリダイレクトされたリクエストにまたがるフックはありません。

詳細については https://blog.golang.org/http-tracing を参照してください。

type ClientTrace struct {
    // GetConn は,接続が作成されるかアイドルプールから取得される前に呼び出されます。
    // hostPort は,ターゲットまたはプロキシの "host:port" です。
    // 利用可能なアイドル状態のキャッシュ接続がすでに存在する場合でも, GetConn が呼び出されます。
    GetConn func(hostPort string)

    // GotConn は,正常な接続が得られた後に呼び出されます。
    // 接続を取得できなかったことに対するフックはありません。
    // 代わりに, Transport.RoundTrip からのエラーを使用してください。
    GotConn func(GotConnInfo)

    // PutIdleConn は,接続がアイドルプールに戻ったときに呼び出されます。
    // err が nil の場合,接続は正常にアイドルプールに返されました。
    // err が nil 以外であれば,なぜそうでないかを説明します。
    // Transport.DisableKeepAlives によって接続の再利用が無効にされている場合, PutIdleConn は呼び出されません。
    // PutIdleConn は,呼び出し側の Response.Body.Close 呼び出しが戻る前に呼び出されます。
    // HTTP/2 では,このフックは現在使用されていません。
    PutIdleConn func(err error)

    // GotFirstResponseByte は,レスポンスヘッダーの最初のバイトが使用可能になったときに呼び出されます。
    GotFirstResponseByte func()

    // Got100Continue は,サーバーが "100Continue" レスポンスでレスポンスした場合に呼び出されます。
    Got100Continue func()

    // Got1xxResponse は,最後の 1xx 以外のレスポンスの前に返された 1xx 通知レスポンスヘッダーごとに呼び出されます。
    // Got100Continue も定義されている場合でも, Got1xxResponse は "100 Continue" レスポンスに対して呼び出されます。
    // エラーが返されると,クライアントリクエストはそのエラー値で中断されます。
    Got1xxResponse func(code int, header textproto.MIMEHeader) error // Go 1.11

    // DNSStart は, DNS 検索が開始されたときに呼び出されます。
    DNSStart func(DNSStartInfo)

    // DNSDone は, DNS 検索が終了したときに呼び出されます。
    DNSDone func(DNSDoneInfo)

    // ConnectStart は,新しい接続のダイヤルが開始されたときに呼び出されます。
    // net.Dialer.DualStack (IPv6 "Happy Eyeballs") サポートが有効になっている場合,これは複数回呼び出される可能性があります。
    ConnectStart func(network, addr string)

    // ConnectDone は,新しい接続のダイヤルが完了したときに呼び出されます。
    // 渡されたエラーは,接続が正常に完了したかどうかを示します。
    // net.Dialer.DualStack ("Happy Eyeballs") サポートが有効になっている場合,これは複数回呼び出されることがあります。
    ConnectDone func(network, addr string, err error)

    // TLSHandshakeStart は,TLS ハンドシェイクが開始されると呼び出されます。
    // HTTP プロキシ経由で HTTPS サイトに接続する場合, CONNECT リクエストがプロキシによって処理された後にハンドシェイクが発生します。
    TLSHandshakeStart func() // Go 1.8

    // TLSHandshakeDone は,成功したハンドシェイクの接続状態,またはハンドシェイク失敗時の nil 以外のエラーのいずれかと共に TLS ハンドシェイクの後に呼び出されます。
    TLSHandshakeDone func(tls.ConnectionState, error) // Go 1.8

    // WroteHeaderField は,トランスポートが各リクエストヘッダーを書き込んだ後に呼び出されます。
    // この呼び出しの時点で,値はバッファリングされていてまだネットワークに書き込まれていない可能性があります。
    WroteHeaderField func(key string, value []string) // Go 1.11

    // WroteHeaders は,トランスポートがすべてのリクエストヘッダーを書き込んだ後に呼び出されます。
    WroteHeaders func()

    // Wait100Continue は,リクエストが "Expect: 100-continue" を指定し,トランスポートがリクエストヘッダを書き込んだがリクエストボディを書き込む前にサーバーからの "100 Continue" を待っている場合に呼び出されます。
    Wait100Continue func()

    // WroteRequest はリクエストとボディを書いた結果で呼ばれます。
    // 再試行されたリクエストの場合は,複数回呼び出されることがあります。
    WroteRequest func(WroteRequestInfo)
}

func ContextClientTrace 1.7

func ContextClientTrace(ctx context.Context) *ClientTrace

ContextClientTrace は,渡されたコンテキストに関連付けられている ClientTrace を返します。 なければ, nil を返します。

type DNSDoneInfo 1.7

DNSDoneInfo には, DNS ルックアップの結果に関する情報が含まれています。

type DNSDoneInfo struct {
    // Addrs は, DNS ルックアップで見つかった IPv4 アドレスまたは IPv6 アドレス,あるいはその両方です。
    // スライスの内容は変更しないでください。
    Addrs []net.IPAddr

    // Err は, DNS ルックアップ中に発生したエラーです。
    Err error

    // Coalesced は,同じ DNS ルックアップを平行に行っていた別の発信者と Addrs が共有されていたかどうかです。
    Coalesced bool
}

type DNSStartInfo 1.7

DNSStartInfo には, DNS リクエストに関する情報が含まれています。

type DNSStartInfo struct {
    Host string
}

type GotConnInfo 1.7

GotConnInfo は ClientTrace.GotConn 関数への引数であり,取得された接続に関する情報を含みます。

type GotConnInfo struct {
    // Conn は取得された接続です。
    // これは http.Transport によって所有されており, ClientTrace のユーザーが読んだり,書いたり,閉じたりしてはいけません。
    Conn net.Conn

    // Reused は,この接続が以前に別の HTTP リクエストに使用されたことがあるかどうかです。
    Reused bool

    // WasIdle は,この接続がアイドルプールから取得されたかどうかです。
    WasIdle bool

    // IdleTime は,WasIdle が true の場合,以前に接続がアイドルだった時間を報告します。
    IdleTime time.Duration
}

type WroteRequestInfo 1.7

WroteRequestInfo には, WroteRequest フックに渡される情報が含まれています。

type WroteRequestInfo struct {
    // Err は,リクエストの書き込み中に発生したエラーです。
    Err error
}