@@ -629,6 +629,10 @@ type Dialer interface {
629629//
630630// Among other uses, this allows to apply a dial timeout.
631631func DialWithDialer (dialer Dialer , addr string ) (* Client , error ) {
632+ return DialWithDialerAndTimeout (dialer , addr , 0 )
633+ }
634+
635+ func DialWithDialerAndTimeout (dialer Dialer , addr string , timeout time.Duration ) (* Client , error ) {
632636 conn , err := dialer .Dial ("tcp" , addr )
633637 if err != nil {
634638 return nil , err
@@ -638,13 +642,14 @@ func DialWithDialer(dialer Dialer, addr string) (*Client, error) {
638642 // there is no way to set the client's Timeout for that action. As a
639643 // workaround, if the dialer has a timeout set, use that for the connection's
640644 // deadline.
641- var timeout time.Duration
642- if netDialer , ok := dialer .(* net.Dialer ); ok && netDialer .Timeout > 0 {
643- err := conn .SetDeadline (time .Now ().Add (netDialer .Timeout ))
644- if err != nil {
645- return nil , err
645+ if timeout == 0 {
646+ if netDialer , ok := dialer .(* net.Dialer ); ok && netDialer .Timeout > 0 {
647+ timeout = netDialer .Timeout
646648 }
647- timeout = netDialer .Timeout
649+ }
650+ err = conn .SetDeadline (time .Now ().Add (timeout ))
651+ if err != nil {
652+ return nil , err
648653 }
649654
650655 c , err := NewWithTimeout (conn , timeout )
@@ -666,6 +671,10 @@ func DialTLS(addr string, tlsConfig *tls.Config) (*Client, error) {
666671//
667672// Among other uses, this allows to apply a dial timeout.
668673func DialWithDialerTLS (dialer Dialer , addr string , tlsConfig * tls.Config ) (* Client , error ) {
674+ return DialWithDialerAndTimeoutTLS (dialer , addr , tlsConfig , 0 )
675+ }
676+
677+ func DialWithDialerAndTimeoutTLS (dialer Dialer , addr string , tlsConfig * tls.Config , timeout time.Duration ) (* Client , error ) {
669678 conn , err := dialer .Dial ("tcp" , addr )
670679 if err != nil {
671680 return nil , err
@@ -685,13 +694,14 @@ func DialWithDialerTLS(dialer Dialer, addr string, tlsConfig *tls.Config) (*Clie
685694 // there is no way to set the client's Timeout for that action. As a
686695 // workaround, if the dialer has a timeout set, use that for the connection's
687696 // deadline.
688- var timeout time.Duration
689- if netDialer , ok := dialer .(* net.Dialer ); ok && netDialer .Timeout > 0 {
690- err := tlsConn .SetDeadline (time .Now ().Add (netDialer .Timeout ))
691- if err != nil {
692- return nil , err
697+ if timeout == 0 {
698+ if netDialer , ok := dialer .(* net.Dialer ); ok && netDialer .Timeout > 0 {
699+ timeout = netDialer .Timeout
693700 }
694- timeout = netDialer .Timeout
701+ }
702+ err = conn .SetDeadline (time .Now ().Add (timeout ))
703+ if err != nil {
704+ return nil , err
695705 }
696706
697707 c , err := NewWithTimeout (tlsConn , timeout )
0 commit comments