mirror of
https://github.com/cedar2025/hysteria.git
synced 2025-06-08 05:19:56 +00:00
90 lines
2.2 KiB
Go
90 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"errors"
|
|
"net"
|
|
"strings"
|
|
|
|
"github.com/HyNetwork/hysteria/pkg/utils"
|
|
rdns "github.com/folbricht/routedns"
|
|
)
|
|
|
|
var errInvalidSyntax = errors.New("invalid syntax")
|
|
|
|
func setResolver(dns string) error {
|
|
if net.ParseIP(dns) != nil {
|
|
// Just an IP address, treat as UDP 53
|
|
dns = "udp://" + net.JoinHostPort(dns, "53")
|
|
}
|
|
var r rdns.Resolver
|
|
if strings.HasPrefix(dns, "udp://") {
|
|
// Standard UDP DNS resolver
|
|
dns = strings.TrimPrefix(dns, "udp://")
|
|
if dns == "" {
|
|
return errInvalidSyntax
|
|
}
|
|
if _, _, err := utils.SplitHostPort(dns); err != nil {
|
|
// Append the default DNS port
|
|
dns = net.JoinHostPort(dns, "53")
|
|
}
|
|
client, err := rdns.NewDNSClient("dns-udp", dns, "udp", rdns.DNSClientOptions{})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
r = client
|
|
} else if strings.HasPrefix(dns, "tcp://") {
|
|
// Standard TCP DNS resolver
|
|
dns = strings.TrimPrefix(dns, "tcp://")
|
|
if dns == "" {
|
|
return errInvalidSyntax
|
|
}
|
|
if _, _, err := utils.SplitHostPort(dns); err != nil {
|
|
// Append the default DNS port
|
|
dns = net.JoinHostPort(dns, "53")
|
|
}
|
|
client, err := rdns.NewDNSClient("dns-tcp", dns, "tcp", rdns.DNSClientOptions{})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
r = client
|
|
} else if strings.HasPrefix(dns, "https://") {
|
|
// DoH resolver
|
|
client, err := rdns.NewDoHClient("doh", dns, rdns.DoHClientOptions{})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
r = client
|
|
} else if strings.HasPrefix(dns, "tls://") {
|
|
// DoT resolver
|
|
dns = strings.TrimPrefix(dns, "tls://")
|
|
if dns == "" {
|
|
return errInvalidSyntax
|
|
}
|
|
if _, _, err := utils.SplitHostPort(dns); err != nil {
|
|
// Append the default DoT port
|
|
dns = net.JoinHostPort(dns, "853")
|
|
}
|
|
client, err := rdns.NewDoTClient("dot", dns, rdns.DoTClientOptions{})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
r = client
|
|
} else if strings.HasPrefix(dns, "quic://") {
|
|
// DoQ resolver
|
|
dns = strings.TrimPrefix(dns, "quic://")
|
|
if dns == "" {
|
|
return errInvalidSyntax
|
|
}
|
|
client, err := rdns.NewDoQClient("doq", dns, rdns.DoQClientOptions{})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
r = client
|
|
} else {
|
|
return errInvalidSyntax
|
|
}
|
|
cache := rdns.NewCache("cache", r, rdns.CacheOptions{})
|
|
net.DefaultResolver = rdns.NewNetResolver(cache)
|
|
return nil
|
|
}
|