Files
opera-proxy/resolver/fabric.go
T

45 lines
870 B
Go
Raw Normal View History

2025-08-12 19:38:17 +03:00
package resolver
import (
"errors"
"net"
"net/url"
"strings"
"github.com/ncruces/go-dns"
)
func FromURL(u string) (*net.Resolver, error) {
parsed, err := url.Parse(u)
if err != nil {
return nil, err
}
2025-08-16 02:52:52 +03:00
host := parsed.Hostname()
port := parsed.Port()
2025-08-12 19:38:17 +03:00
switch strings.ToLower(parsed.Scheme) {
case "", "dns":
if port == "" {
port = "53"
}
return NewPlainResolver(net.JoinHostPort(host, port)), nil
case "tcp":
if port == "" {
port = "53"
}
return NewTCPResolver(net.JoinHostPort(host, port)), nil
case "http", "https":
2025-08-16 02:52:52 +03:00
if port == "" {
port = "443"
}
return dns.NewDoHResolver(u, dns.DoHAddresses(net.JoinHostPort(host, port)))
2025-08-12 19:38:17 +03:00
case "tls":
if port == "" {
port = "853"
}
2025-08-16 02:52:52 +03:00
hp := net.JoinHostPort(host, port)
return dns.NewDoTResolver(hp, dns.DoTAddresses(hp))
2025-08-12 19:38:17 +03:00
default:
return nil, errors.New("not implemented")
}
}