mirror of
https://github.com/shtorm-7/sing-box-extended.git
synced 2026-09-15 21:00:27 +00:00
dns: Add preferred_by rule item
This commit is contained in:
@@ -19,7 +19,10 @@ func RegisterTransport(registry *dns.TransportRegistry) {
|
||||
dns.RegisterTransport[option.HostsDNSServerOptions](registry, C.DNSTypeHosts, NewTransport)
|
||||
}
|
||||
|
||||
var _ adapter.DNSTransport = (*Transport)(nil)
|
||||
var (
|
||||
_ adapter.DNSTransport = (*Transport)(nil)
|
||||
_ adapter.DNSTransportWithPreferredDomain = (*Transport)(nil)
|
||||
)
|
||||
|
||||
type Transport struct {
|
||||
dns.TransportAdapter
|
||||
@@ -66,6 +69,18 @@ func (t *Transport) Close() error {
|
||||
func (t *Transport) Reset() {
|
||||
}
|
||||
|
||||
func (t *Transport) PreferredDomain(domain string) bool {
|
||||
if _, loaded := t.predefined[domain]; loaded {
|
||||
return true
|
||||
}
|
||||
for _, file := range t.files {
|
||||
if len(file.Lookup(domain)) > 0 {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (t *Transport) Exchange(ctx context.Context, message *mDNS.Msg) (*mDNS.Msg, error) {
|
||||
question := message.Question[0]
|
||||
domain := mDNS.CanonicalName(question.Name)
|
||||
|
||||
@@ -23,7 +23,10 @@ func RegisterTransport(registry *dns.TransportRegistry) {
|
||||
dns.RegisterTransport[option.LocalDNSServerOptions](registry, C.DNSTypeLocal, NewTransport)
|
||||
}
|
||||
|
||||
var _ adapter.DNSTransport = (*Transport)(nil)
|
||||
var (
|
||||
_ adapter.DNSTransport = (*Transport)(nil)
|
||||
_ adapter.DNSTransportWithPreferredDomain = (*Transport)(nil)
|
||||
)
|
||||
|
||||
type Transport struct {
|
||||
dns.TransportAdapter
|
||||
@@ -97,6 +100,15 @@ func (t *Transport) Close() error {
|
||||
func (t *Transport) Reset() {
|
||||
}
|
||||
|
||||
func (t *Transport) PreferredDomain(domain string) bool {
|
||||
if t.hosts != nil && t.resolved == nil {
|
||||
if len(t.hosts.Lookup(dns.FqdnToDomain(domain))) > 0 {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return t.hasNeighborHost(domain)
|
||||
}
|
||||
|
||||
func (t *Transport) Exchange(ctx context.Context, message *mDNS.Msg) (*mDNS.Msg, error) {
|
||||
if t.resolved != nil {
|
||||
response := t.lookupNeighbor(message)
|
||||
|
||||
@@ -24,7 +24,10 @@ func RegisterTransport(registry *dns.TransportRegistry) {
|
||||
dns.RegisterTransport[option.LocalDNSServerOptions](registry, C.DNSTypeLocal, NewTransport)
|
||||
}
|
||||
|
||||
var _ adapter.DNSTransport = (*Transport)(nil)
|
||||
var (
|
||||
_ adapter.DNSTransport = (*Transport)(nil)
|
||||
_ adapter.DNSTransportWithPreferredDomain = (*Transport)(nil)
|
||||
)
|
||||
|
||||
type Transport struct {
|
||||
dns.TransportAdapter
|
||||
@@ -106,3 +109,12 @@ func (t *Transport) Reset() {
|
||||
t.dhcpTransport.Reset()
|
||||
}
|
||||
}
|
||||
|
||||
func (t *Transport) PreferredDomain(domain string) bool {
|
||||
if t.hosts != nil {
|
||||
if len(t.hosts.Lookup(dns.FqdnToDomain(domain))) > 0 {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return t.hasNeighborHost(domain)
|
||||
}
|
||||
|
||||
@@ -43,6 +43,17 @@ func (t *Transport) lookupNeighbor(message *mDNS.Msg) *mDNS.Msg {
|
||||
return dns.FixedResponse(message.Id, question, addresses, C.DefaultDNSTTL)
|
||||
}
|
||||
|
||||
func (t *Transport) hasNeighborHost(domain string) bool {
|
||||
if t.neighborResolver == nil {
|
||||
return false
|
||||
}
|
||||
host := extractNeighborHost(domain, t.neighborSuffixes)
|
||||
if host == "" {
|
||||
return false
|
||||
}
|
||||
return len(t.neighborResolver.LookupAddresses(host)) > 0
|
||||
}
|
||||
|
||||
func extractNeighborHost(canonical string, suffixes []string) string {
|
||||
for _, suffix := range suffixes {
|
||||
if !strings.HasSuffix(canonical, suffix) || len(canonical) <= len(suffix) {
|
||||
|
||||
Reference in New Issue
Block a user