dae/common/netutils/context_dialer.go

39 lines
628 B
Go
Raw Normal View History

2023-01-23 18:54:21 +07:00
/*
* SPDX-License-Identifier: AGPL-3.0-only
* Copyright (c) 2022-2024, daeuniverse Organization <dae@v2raya.org>
2023-01-23 18:54:21 +07:00
*/
package netutils
2023-01-23 18:54:21 +07:00
import (
"context"
"net"
)
type ContextDialer struct {
Dialer net.Dialer
2023-01-23 18:54:21 +07:00
}
func (d *ContextDialer) DialContext(ctx context.Context, network, addr string) (c net.Conn, err error) {
var done = make(chan struct{})
go func() {
c, err = d.Dialer.Dial(network, addr)
if err != nil {
close(done)
return
}
select {
case <-ctx.Done():
_ = c.Close()
default:
close(done)
}
}()
select {
case <-ctx.Done():
return nil, ctx.Err()
case <-done:
return c, err
}
}