mirror of
https://github.com/daeuniverse/dae.git
synced 2025-07-23 22:31:24 +07:00
optimize(dial_mode): cache for real domain
This commit is contained in:
@ -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],
|
||||
|
Reference in New Issue
Block a user