func()

in transport/httpcommon/diag.go [39:133]


func (settings *HTTPTransportSettings) DiagRequests(reqs []*http.Request, opts ...TransportOption) func() []byte {
	if settings == nil {
		return func() []byte {
			return []byte(`error: nil httpcommon.HTTPTransportSettings`)
		}
	}
	if len(reqs) == 0 {
		return func() []byte {
			return []byte(`error: 0 requests`)
		}
	}
	return func() []byte {
		var b bytes.Buffer
		rt, err := settings.RoundTripper(opts...)
		if err != nil {
			b.WriteString("unable to get roundtripper: " + err.Error())
			return b.Bytes()
		}
		logger := log.New(&b, "", log.LstdFlags|log.Lmicroseconds|log.LUTC)
		if settings.TLS == nil {
			logger.Print("No TLS settings")
		} else {
			logger.Print("TLS settings detected")
		}
		logger.Printf("Proxy disable=%v url=%s", settings.Proxy.Disable, settings.Proxy.URL)

		ct := &httptrace.ClientTrace{
			GetConn: func(hostPort string) {
				logger.Printf("GetConn called for %q", hostPort)
			},
			GotConn: func(connInfo httptrace.GotConnInfo) {
				logger.Printf("GotConn for %q", connInfo.Conn.RemoteAddr())
			},
			GotFirstResponseByte: func() {
				logger.Print("Response started")
			},
			Got1xxResponse: func(code int, header textproto.MIMEHeader) error {
				logger.Printf("Got info response status=%d, headers=%v", code, header)
				return nil
			},
			DNSStart: func(info httptrace.DNSStartInfo) {
				logger.Printf("Starting DNS lookup for %q", info.Host)
			},
			DNSDone: func(info httptrace.DNSDoneInfo) {
				logger.Printf("Done DNS lookup: %+v", info)
			},
			ConnectStart: func(network, addr string) {
				logger.Printf("Connection started to %s:%s", network, addr)
			},
			ConnectDone: func(network, addr string, err error) {
				logger.Printf("Connection to %s:%s done, err: %v", network, addr, err)
			},
			TLSHandshakeStart: func() {
				logger.Print("TLS handshake starting")
			},
			TLSHandshakeDone: func(state tls.ConnectionState, err error) {
				logger.Printf("TLS handshake done. state=%+v err=%v", state, err)
				logger.Printf("Peer certificate count %d", len(state.PeerCertificates))
				for i, crt := range state.PeerCertificates {
					logger.Printf("- Peer Certificate %d\n\t%s", i, tlscommon.CertDiagString(crt))
				}

				logger.Printf("Verified chains count: %d", len(state.VerifiedChains))
				for i, chain := range state.VerifiedChains {
					for j, crt := range chain {
						logger.Printf("- Chain %d certificate %d\n\t%s", i, j, tlscommon.CertDiagString(crt))
					}
				}
			},
			WroteHeaders: func() {
				logger.Printf("Wrote request headers")
			},
			Wait100Continue: func() {
				logger.Printf("Waiting for continue")
			},
			WroteRequest: func(info httptrace.WroteRequestInfo) {
				logger.Printf("Wrote request err=%v", info.Err)
			},
		}
		for i, req := range reqs {
			logger.Printf("Request %d to %s starting", i, req.URL.String())
			req = req.WithContext(httptrace.WithClientTrace(req.Context(), ct))
			if resp, err := rt.RoundTrip(req); err != nil {
				logger.Printf("request %d error: %s", i, diagError(err))
			} else if isGoHTTPResp(resp) {
				resp.Body.Close()
				logger.Printf("request %d error: HTTP request sent to HTTPS server.", i)
			} else {
				resp.Body.Close()
				logger.Printf("request %d successful. status=%d", i, resp.StatusCode)
			}
		}
		return b.Bytes()
	}
}