mirror of
https://github.com/fumiama/terasu.git
synced 2026-06-27 08:10:23 +08:00
fix(dns): stop ranging on tls dial success
This commit is contained in:
34
dns/dns.go
34
dns/dns.go
@@ -17,6 +17,8 @@ import (
|
|||||||
var (
|
var (
|
||||||
// ErrNoDNSAvailable is reported when all servers failed to response
|
// ErrNoDNSAvailable is reported when all servers failed to response
|
||||||
ErrNoDNSAvailable = errors.New("no dns available")
|
ErrNoDNSAvailable = errors.New("no dns available")
|
||||||
|
// ErrSuccess is designed for range hosts to break
|
||||||
|
ErrSuccess = errors.New("success")
|
||||||
)
|
)
|
||||||
|
|
||||||
var dnsDialer = net.Dialer{
|
var dnsDialer = net.Dialer{
|
||||||
@@ -32,6 +34,19 @@ type dnsstat struct {
|
|||||||
e bool
|
e bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ds *dnsstat) String() string {
|
||||||
|
sb := strings.Builder{}
|
||||||
|
sb.WriteString("[addr: ")
|
||||||
|
sb.WriteString(ds.a)
|
||||||
|
sb.WriteString(", enable: ")
|
||||||
|
if ds.e {
|
||||||
|
sb.WriteString("true]")
|
||||||
|
} else {
|
||||||
|
sb.WriteString("false]")
|
||||||
|
}
|
||||||
|
return sb.String()
|
||||||
|
}
|
||||||
|
|
||||||
func (ds *dnsstat) disable(reEnable time.Duration) {
|
func (ds *dnsstat) disable(reEnable time.Duration) {
|
||||||
ds.e = false
|
ds.e = false
|
||||||
// re-enable after some times
|
// re-enable after some times
|
||||||
@@ -130,7 +145,7 @@ func (ds *DNSList) lookupHostDoH(ctx context.Context, host string) (hosts []stri
|
|||||||
if err == nil {
|
if err == nil {
|
||||||
hosts = jr.hosts()
|
hosts = jr.hosts()
|
||||||
if len(hosts) > 0 {
|
if len(hosts) > 0 {
|
||||||
return nil
|
return ErrSuccess
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !errors.Is(err, context.DeadlineExceeded) && !errors.Is(err, context.Canceled) {
|
if !errors.Is(err, context.DeadlineExceeded) && !errors.Is(err, context.Canceled) {
|
||||||
@@ -139,6 +154,9 @@ func (ds *DNSList) lookupHostDoH(ctx context.Context, host string) (hosts []stri
|
|||||||
}
|
}
|
||||||
return nil // not found, fallback to ds.b
|
return nil // not found, fallback to ds.b
|
||||||
})
|
})
|
||||||
|
if errors.Is(err, ErrSuccess) {
|
||||||
|
err = nil
|
||||||
|
}
|
||||||
if len(hosts) > 0 || err != nil {
|
if len(hosts) > 0 || err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -164,7 +182,7 @@ func (ds *DNSList) DialContext(ctx context.Context, dialer *net.Dialer, firstFra
|
|||||||
if !addr.e || strings.HasPrefix(addr.a, "https://") { // disabled or is DoH
|
if !addr.e || strings.HasPrefix(addr.a, "https://") { // disabled or is DoH
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
logrus.Debugln("[terasu.dns] start dial", host, addr)
|
logrus.Debugln("[terasu.dns] -> dial", host, addr)
|
||||||
if dialer.Timeout != 0 {
|
if dialer.Timeout != 0 {
|
||||||
var cancel context.CancelFunc
|
var cancel context.CancelFunc
|
||||||
ctx, cancel = context.WithTimeout(context.Background(), dialer.Timeout)
|
ctx, cancel = context.WithTimeout(context.Background(), dialer.Timeout)
|
||||||
@@ -176,27 +194,29 @@ func (ds *DNSList) DialContext(ctx context.Context, dialer *net.Dialer, firstFra
|
|||||||
}
|
}
|
||||||
conn, err = dialer.DialContext(ctx, "tcp", addr.a)
|
conn, err = dialer.DialContext(ctx, "tcp", addr.a)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logrus.Debugln("[terasu.dns] dial tcp", host, addr, "err:", err)
|
logrus.Debugln("[terasu.dns] -- dial tcp", host, addr, "err:", err)
|
||||||
if !errors.Is(err, context.DeadlineExceeded) && !errors.Is(err, context.Canceled) {
|
if !errors.Is(err, context.DeadlineExceeded) && !errors.Is(err, context.Canceled) {
|
||||||
addr.disable(time.Hour) // no need to acquire write lock
|
addr.disable(time.Hour) // no need to acquire write lock
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
logrus.Debugln("[terasu.dns] start hs tls", host, addr)
|
logrus.Debugln("[terasu.dns] <- dial tcp", host, addr, "succeeded")
|
||||||
|
logrus.Debugln("[terasu.dns] -> hs tls", host, addr)
|
||||||
tlsConn = tls.Client(conn, &tls.Config{
|
tlsConn = tls.Client(conn, &tls.Config{
|
||||||
ServerName: host,
|
ServerName: host,
|
||||||
MinVersion: tls.VersionTLS12,
|
MinVersion: tls.VersionTLS12,
|
||||||
NextProtos: []string{"dns"},
|
NextProtos: []string{"dns"},
|
||||||
})
|
})
|
||||||
if firstFragmentLen > 0 {
|
if firstFragmentLen > 0 {
|
||||||
logrus.Debugln("[terasu.dns] hs tls", host, addr, "use first frag len", firstFragmentLen)
|
logrus.Debugln("[terasu.dns] -- hs tls", host, addr, "use first frag len", firstFragmentLen)
|
||||||
err = terasu.Use(tlsConn).HandshakeContext(ctx, firstFragmentLen)
|
err = terasu.Use(tlsConn).HandshakeContext(ctx, firstFragmentLen)
|
||||||
} else {
|
} else {
|
||||||
logrus.Debugln("[terasu.dns] hs tls", host, addr, "normally")
|
logrus.Debugln("[terasu.dns] -- hs tls", host, addr, "normally")
|
||||||
err = tlsConn.HandshakeContext(ctx)
|
err = tlsConn.HandshakeContext(ctx)
|
||||||
}
|
}
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return nil
|
logrus.Debugln("[terasu.dns] <- hs tls", host, addr, "succeeded")
|
||||||
|
return ErrSuccess
|
||||||
}
|
}
|
||||||
logrus.Debugln("[terasu.dns] hs tls", host, addr, "err:", err)
|
logrus.Debugln("[terasu.dns] hs tls", host, addr, "err:", err)
|
||||||
_ = tlsConn.Close()
|
_ = tlsConn.Close()
|
||||||
|
|||||||
Reference in New Issue
Block a user