It depends on how far down the connection process it reached before timing 
out...
What is the timeout setting your http client?

Try this example:


func main() {
req, _ := http.NewRequest("GET", 
"https://deelay.me/300/https://google.com";, nil)
trace := &httptrace.ClientTrace{
GetConn: func(hostPort string) {
fmt.Printf("Get Conn: %s\n", hostPort)
},
GotConn: func(connInfo httptrace.GotConnInfo) {
fmt.Printf("Got Conn: %s\n", connInfo.Conn.LocalAddr().String())
},
ConnectStart: func(network, addr string) {
fmt.Printf("Conn start: %s %s\n", network, addr)
},
ConnectDone: func(network, addr string, err error) {
fmt.Printf("Conn done: %s %s\n", network, addr)
},
}
req = req.WithContext(httptrace.WithClientTrace(req.Context(), trace))

client := http.Client{
Timeout: time.Millisecond * 250,
}
if _, err := client.Do(req); err != nil {
log.Fatal(err)
}
}

-----------------------
Output:
Get Conn: deelay.me:443
Conn start: tcp 167.99.174.142:443
Conn done: tcp 167.99.174.142:443
*Got Conn: 192.168.0.103:52450*
2020/10/14 14:11:04 Get "https://deelay.me/300/https://google.com": context 
deadline exceeded (Client.Timeout exceeded while awaiting headers)
--------------------

If you play with the timeout value and set the timeout on the client to be 
too small, GotConn is not hit because the timeout triggers before acquiring 
a connection for example due to a TLS handshake delay etc.

>>> I'm not seeing anything in the httptrace library for for a 
"FailedConnInfo" equivalent to "GotConnInfo." Am I overlooking something?

the GotConn documentation says that for errors look for the error returned 
by the roundtrip call

On Tuesday, October 13, 2020 at 12:18:01 PM UTC-7 ryan...@gmail.com wrote:

> One problem came up. Sorry for the false positive.
>
> How can I capture this information for a request which failed to connect?
>
> If a connection times out with, say "context deadline exceeded 
> (Client.Timeout exceeded while awaiting headers)", the local outgoing port 
> is not captured.
>
> I'm not seeing anything in the httptrace library for for a 
> "FailedConnInfo" equivalent to "GotConnInfo." Am I overlooking something?
>
> On Thursday, October 8, 2020 at 1:12:39 PM UTC-5 urji...@gmail.com wrote:
>
>> Hi Ryan,
>>
>> You can get it via httptrace (https://blog.golang.org/http-tracing)
>>
>> Example:
>>   req, _ := http.NewRequest("GET", "http://example.com";, nil)
>>   trace := &httptrace.ClientTrace{
>>               GotConn: func(connInfo httptrace.GotConnInfo) {
>>                               fmt.Printf("Got Conn: %s\n", 
>> connInfo.Conn.LocalAddr().String()) <------------------------- This has the 
>> local outgoing port
>>               },
>>    }
>>   req = req.WithContext(httptrace.WithClientTrace(req.Context(), trace))
>>   if _, err := http.DefaultTransport.RoundTrip(req); err != nil {
>>              log.Fatal(err)
>>   }
>>
>>
>> On Wednesday, October 7, 2020 at 9:09:54 AM UTC-7 ryan...@gmail.com 
>> wrote:
>>
>>> Is it possible to capture the outgoing port for a given HTTP request?
>>>
>>> I'm using a knockoff of ab that I wrote in go to send repeated requests 
>>> to a given web service. Sometimes we get an error and I want to look at a 
>>> packet trace of it. The problem is it's really hard to find one failed 
>>> request in 1,000 in a tcp dump. If I can see the source port, that would 
>>> help me narrow it down.
>>>
>>> The code I'm doing is effectively this (forgive any typos, this is a 
>>> quick & dirty recopy, not a cut & paste):
>>>
>>> tlsConfig := &tls.Config{
>>>     InsecureSkipVerify: true,
>>> }
>>>
>>> transport := &http.Transport{
>>>     DisableKeepAlives: true,
>>>     TLSClientCOnfig: tlsCOnfig,
>>>     ResponseHeaderTimeout: time.Duration(headerTimeout) * time.Second,
>>> }
>>>
>>> client := &http.Client{
>>>     Timeout: time.Duration(timeOut) * time.second,
>>>     Transport: transport,
>>> }
>>>
>>> response, err :=client.Get(*targetURL)    // How can I capture the 
>>> outgoing port from this?
>>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/5b0e87a9-780b-44f6-8d0a-ba7014330a63n%40googlegroups.com.

Reply via email to