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
I have this:
// Timeout type Timeout struct { Connect time.Duration ReadWrite time.Duration } // TimeoutDialer func TimeoutDialer(timeout *Timeout) func(net, addr string) (c net.Conn, err error) { return func(netw, addr string) (net.Conn, error) { conn, err := net.DialTimeout(netw, addr, timeout.Connect) if err != nil { return nil, err } conn.SetDeadline(time.Now().Add(timeout.ReadWrite)) return conn, nil } } // HttpClient func HttpClient(config Config) *http.Client { to := &Timeout{ Connect: time.Duration(config.MaxWait) * time.Second, ReadWrite: time.Duration(config.MaxWait) * time.Second, } return &http.Client{ Transport: &http.Transport{ Dial: TimeoutDialer(to), }, } }
In Python, use the stdin. readline() and stdout. write() instead of input and print. Ensure that the input value to test cases is passed in the expected format.
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") }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With