Пакет 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
}
Читайте также:
Комментариев нет:
Отправить комментарий