суббота, 22 августа 2020 г.

Пакет httptrace в Golang

Пакет httptrace предоставляет механизмы для отслеживания событий в клиентских HTTP-запросах.

Пример использования httptrace

package main

import (
    "fmt"
    "log"
    "net/http"
    "net/http/httptrace"
)

func main() {
    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)
    }
}

Функция WithClientTrace

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

WithClientTrace возвращает новый контекст на основе предоставленного родительского ctx. Запросы клиента HTTP, сделанные с возвращенным контекстом, будут использовать предоставленные перехватчики трассировки в дополнение к любым предыдущим перехватчикам, зарегистрированным с помощью ctx. Любые хуки, определенные в предоставленной трассировке, будут вызываться первыми.

Тип ClientTrace

ClientTrace - это набор перехватчиков для запуска на различных этапах исходящего HTTP-запроса. Любой конкретный хук может быть nil. Функции могут вызываться одновременно из разных goroutines, а некоторые из них могут вызываться после завершения или сбоя запроса.

ClientTrace в настоящее время отслеживает один HTTP-запрос и ответ в течение одного цикла и не имеет перехватчиков, которые охватывают серию перенаправленных запросов.

type ClientTrace struct {
    // GetConn вызывается 
    // перед созданием соединения или
    // извлекается из неактивного пула. 
    // hostPort - это "host:port" 
    // цели или прокси. 
    // GetConn называется даже
    // если уже доступно незанятое 
    // кэшированное соединение.
    GetConn func(hostPort string)

    // GotConn вызывается после 
    // успешного получения подключения.
    // Нет никакого хука 
    // для неуспешного получения соединения; 
    // вместо этого используйте ошибку из 
    // Transport.RoundTrip.
    GotConn func(GotConnInfo)

    // PutIdleConn вызывается, 
    // когда соединение возвращается в пул ожидания.
    // Если err равен nil, соединение было
    // успешно возвращено в пул ожидания. 
    // Если err не равно nil, объясняет, почему нет. 
    // PutIdleConn не вызывается, если
    // повторное использование соединения 
    // отключено через Transport.DisableKeepAlives.
    // PutIdleConn вызывается до 
    // возврата вызов Response.Body.Close.
    // Для HTTP/2 этот хук в настоящее время не используется.
    PutIdleConn func(err error)

    // GotFirstResponseByte вызывается, 
    // когда первый байт заголовков ответа доступен.
    GotFirstResponseByte func()

    // Got100Continue вызывается, 
    // если сервер отвечает "100 Continue"
    Got100Continue func()

    // Got1xxResponse вызывается для каждого 
    // информационного заголовка ответа 1xx
    // возвращается перед окончательным ответом, 
    // отличным от 1xx. Got1xxResponse называется
    // для ответов "100 Continue", 
    // даже если также определено Got100Continue.
    // Если он возвращает ошибку, 
    // клиентский запрос прерывается с этим значением ошибки.
    Got1xxResponse func(code int, header textproto.MIMEHeader) error // Go 1.11

    // DNSStart вызывается, когда начинается поиск DNS.
    DNSStart func(DNSStartInfo)

    // DNSDone вызывается по окончании поиска DNS.
    DNSDone func(DNSDoneInfo)

    // ConnectStart вызывается, 
    // когда начинается Dial нового соединения.
    // Если net.Dialer.DualStack 
    // (IPv6 "Happy Eyeballs") поддержка
    // включена, ConnectStart можно вызывать несколько раз.
    ConnectStart func(network, addr string)

    // ConnectDone вызывается 
    // когда Dial нового соединения завершается. 
    // Предоставленная err указывает,
    // успешно ли соединение завершено.
    // Если поддержка net.Dialer.DualStack ("Happy Eyeballs")
    // включена, ConnectDone можно вызывать несколько раз.
    ConnectDone func(network, addr string, err error)

    // TLSHandshakeStart вызывается, 
    // когда начинается рукопожатие TLS.
    // Когда подключаемся к HTTPS-сайту 
    // через HTTP-прокси, рукопожатие происходит 
    // после того, как запрос CONNECT обработан прокси.
    TLSHandshakeStart func() // Go 1.8

    // TLSHandshakeDone вызывается 
    // после TLS рукопожатие 
    // с успешным статусом соединения 
    // при успешном рукопожатии или 
    // есть ошибка, отличная от nil при сбое рукопожатия.
    TLSHandshakeDone func(tls.ConnectionState, error) // Go 1.8

    // WroteHeaderField вызывается 
    // после того, как Transport записал
    // заголовок каждого запроса. 
    // Во время этого вызова значения
    // могут быть буферизованы и еще не записаны в сеть.
    WroteHeaderField func(key string, value []string) // Go 1.11

    // WroteHeaders вызывается 
    // после того, как Transport записал
    // все заголовки запроса.
    WroteHeaders func()

    // Wait100Continue вызывается, если указан запрос
    // "Expect: 100-continue", и Transport записал
    // заголовки запроса, но ожидает "100 Continue" от
    // сервера перед записью тела запроса.
    Wait100Continue func()

    // WroteRequest вызывается с результатом записи
    // запроса и любого тела. Может вызываться несколько раз
    // в случае повторных запросов.
    WroteRequest func(WroteRequestInfo)
}

Функция ContextClientTrace

func ContextClientTrace(ctx context.Context) *ClientTrace

ContextClientTrace возвращает ClientTrace, связанный с предоставленным контекстом. Если нет, возвращается nil.

Тип DNSDoneInfo

DNSDoneInfo содержит информацию о результатах поиска DNS.

type DNSDoneInfo struct {
    // Addrs - это адреса IPv4 и/или IPv6, 
    // найденные в DNS поиске. 
    // Содержимое среза не должно изменяться.
    Addrs []net.IPAddr

    // Err - это любая ошибка, 
    // произошедшая во время поиска DNS.
    Err error

    // Coalesced флаг true если Addrs 
    // совместно использованы с другим вызывающим абонентом, 
    // который одновременно выполнял такой же поиск DNS.
    Coalesced bool
}

Тип DNSStartInfo

DNSStartInfo содержит информацию о DNS-запросе.

type DNSStartInfo struct {
    Host string
}

Тип GotConnInfo

GotConnInfo является аргументом функции ClientTrace.GotConn и содержит информацию о полученном соединении.

type GotConnInfo struct {
    // Conn - это полученное соединение. 
    // Оно принадлежит http.Transport 
    // и его нельзя читать, писать или
    // закрыть пользователями ClientTrace.
    Conn net.Conn

    // Reused равен true если это соединение
    // было ранее использовано для другого HTTP-запроса.
    Reused bool

    // WasIdle - было ли это соединение получено из
    // пула ожидания.
    WasIdle bool

    // IdleTime сообщает, 
    // сколько времени соединение 
    // ранее было бездействующим, 
    // если WasIdle истинно.
    IdleTime time.Duration
}

Тип WroteRequestInfo

WroteRequestInfo содержит информацию, предоставленную хуку WroteRequest.

type WroteRequestInfo struct {
    // Err - это любая ошибка, обнаруженная при записи запроса.
    Err error
}


Читайте также:


Комментариев нет:

Отправить комментарий