"fmt"
"io"
"net"
+ "os"
"time"
)
if !stop() {
<-interrupted
+ if err == nil || deadlineOnly(err) {
+ err = ctx.Err()
+ }
+
err = errors.Join(err, interruptErr, ctx.Err())
}
}()
return deadline
}
+
+func deadlineOnly(err error) bool {
+ joined, ok := err.(interface{ Unwrap() []error })
+ if ok {
+ found := false
+
+ for _, cause := range joined.Unwrap() {
+ if cause != nil {
+ found = true
+ if !deadlineOnly(cause) {
+ return false
+ }
+ }
+ }
+
+ return found
+ }
+
+ wrapped, ok := err.(interface{ Unwrap() error })
+ if ok {
+ return deadlineOnly(wrapped.Unwrap())
+ }
+
+ return errors.Is(err, os.ErrDeadlineExceeded)
+}