@@ -10,6 +10,10 @@ import (
1010 "context"
1111 "errors"
1212 "fmt"
13+ "io"
14+ "net"
15+ "os"
16+ "strings"
1317 "time"
1418
1519 "go.mongodb.org/mongo-driver/v2/x/mongo/driver/description"
@@ -28,21 +32,28 @@ type ConnectionError struct {
2832
2933// Error implements the error interface.
3034func (e ConnectionError ) Error () string {
31- message := e . message
35+ var messages [] string
3236 if e .init {
33- fullMsg := "error occurred during connection handshake"
34- if message != "" {
35- fullMsg = fmt .Sprintf ("%s: %s" , fullMsg , message )
36- }
37- message = fullMsg
37+ messages = append (messages , "error occurred during connection handshake" )
3838 }
39- if e .Wrapped != nil && message != "" {
40- return fmt . Sprintf ( "connection(%s) %s: %s" , e .ConnectionID , message , e . Wrapped . Error () )
39+ if e .message != "" {
40+ messages = append ( messages , e .message )
4141 }
4242 if e .Wrapped != nil {
43- return fmt .Sprintf ("connection(%s) %s" , e .ConnectionID , e .Wrapped .Error ())
43+ if errors .Is (e .Wrapped , io .EOF ) {
44+ messages = append (messages , "connection closed unexpectedly by the other side" )
45+ }
46+ if errors .Is (e .Wrapped , os .ErrDeadlineExceeded ) {
47+ messages = append (messages , "client timed out waiting for server response" )
48+ } else if err , ok := e .Wrapped .(net.Error ); ok && err .Timeout () {
49+ messages = append (messages , "client timed out waiting for server response" )
50+ }
51+ messages = append (messages , e .Wrapped .Error ())
52+ }
53+ if len (messages ) > 0 {
54+ return fmt .Sprintf ("connection(%s) %s" , e .ConnectionID , strings .Join (messages , ": " ))
4455 }
45- return fmt .Sprintf ("connection(%s) %s " , e .ConnectionID , message )
56+ return fmt .Sprintf ("connection(%s)" , e .ConnectionID )
4657}
4758
4859// Unwrap returns the underlying error.
0 commit comments