optimize(dial_mode): cache for real domain

This commit is contained in:
mzz2017
2023-03-13 16:40:37 +08:00
parent 9224d96521
commit f061ca7884
7 changed files with 107 additions and 35 deletions

View File

@ -7,9 +7,12 @@ package netutils
import (
"context"
"errors"
"fmt"
"github.com/mzz2017/softwind/netproxy"
"golang.org/x/net/dns/dnsmessage"
"net/netip"
"sync"
)
type Ip46 struct {
@ -17,20 +20,59 @@ type Ip46 struct {
Ip6 netip.Addr
}
func ResolveIp46(ctx context.Context, dialer netproxy.Dialer, dns netip.AddrPort, host string, tcp bool) (ipv46 *Ip46, err error) {
addrs4, err := ResolveNetip(ctx, dialer, dns, host, dnsmessage.TypeA, tcp)
if err != nil {
return nil, err
}
if len(addrs4) == 0 {
addrs4 = []netip.Addr{{}}
}
addrs6, err := ResolveNetip(ctx, dialer, dns, host, dnsmessage.TypeAAAA, tcp)
if err != nil {
return nil, err
}
if len(addrs6) == 0 {
addrs6 = []netip.Addr{{}}
func ResolveIp46(ctx context.Context, dialer netproxy.Dialer, dns netip.AddrPort, host string, tcp bool, race bool) (ipv46 *Ip46, err error) {
var wg sync.WaitGroup
wg.Add(2)
var err4, err6 error
var addrs4, addrs6 []netip.Addr
ctx4, cancel4 := context.WithCancel(ctx)
ctx6, cancel6 := context.WithCancel(ctx)
go func() {
defer func() {
wg.Done()
cancel4()
if race {
cancel6()
}
}()
var e error
addrs4, e = ResolveNetip(ctx4, dialer, dns, host, dnsmessage.TypeA, tcp)
if err != nil && !errors.Is(e, context.Canceled) {
err4 = e
return
}
if len(addrs4) == 0 {
addrs4 = []netip.Addr{{}}
}
}()
go func() {
defer func() {
wg.Done()
cancel6()
if race {
cancel4()
}
}()
var e error
addrs6, e = ResolveNetip(ctx6, dialer, dns, host, dnsmessage.TypeAAAA, tcp)
if err != nil && !errors.Is(e, context.Canceled) {
err6 = e
return
}
if len(addrs6) == 0 {
addrs6 = []netip.Addr{{}}
}
}()
wg.Wait()
if err4 != nil || err6 != nil {
if err4 != nil && err6 != nil {
return nil, fmt.Errorf("%w: %v", err4, err6)
}
if err4 != nil {
return nil, err4
} else {
return nil, err6
}
}
return &Ip46{
Ip4: addrs4[0],