I use the following to check for timeouts when calling a webservice, but I would like to check specifically if there is a timeout error returned. How do I do that :S
As of go1.6, all errors from timeouts should conform to net.Error with Timeout() set properly. All you need to check for is:
if err, ok := err.(net.Error); ok && err.Timeout() {
In older versions, checking for timeout through the http package was more difficult.
*net.OpError with Timeout() if you hit a Deadline set on the underlying connection.tlsHandshakeTimeoutError (which is obviously not exported) that implements the net.Error interface.url.Error, if there was a problem within the url package (timeout during initial connection)http.Client.Timeout[go1.3+] (which calls Transport.CancelRequest). As of go1.5, this will have the Timeout property set correctly.You could check for a net.Error with a type switch:
switch err := err.(type) {
case net.Error:
if err.Timeout() {
fmt.Println("This was a net.Error with a Timeout")
}
case *url.Error:
fmt.Println("This is a *url.Error")
if err, ok := err.Err.(net.Error); ok && err.Timeout() {
fmt.Println("and it was because of a timeout")
}
}
With go < 1.5 you will need to check the error string for an http.Client timeout:
if err != nil && strings.Contains(err.Error(), "use of closed network connection") {
fmt.Println("Could be from a Transport.CancelRequest")
}