chore: adjust the internal code structure of the dns module
Some checks failed
Test / test (1.20, macos-13) (push) Has been cancelled
Test / test (1.20, macos-latest) (push) Has been cancelled
Test / test (1.20, ubuntu-24.04-arm) (push) Has been cancelled
Test / test (1.20, ubuntu-latest) (push) Has been cancelled
Test / test (1.20, windows-latest) (push) Has been cancelled
Test / test (1.21, macos-13) (push) Has been cancelled
Test / test (1.21, macos-latest) (push) Has been cancelled
Test / test (1.21, ubuntu-24.04-arm) (push) Has been cancelled
Test / test (1.21, ubuntu-latest) (push) Has been cancelled
Test / test (1.21, windows-latest) (push) Has been cancelled
Test / test (1.22, macos-13) (push) Has been cancelled
Test / test (1.22, macos-latest) (push) Has been cancelled
Test / test (1.22, ubuntu-24.04-arm) (push) Has been cancelled
Test / test (1.22, ubuntu-latest) (push) Has been cancelled
Test / test (1.22, windows-latest) (push) Has been cancelled
Test / test (1.23, macos-13) (push) Has been cancelled
Test / test (1.23, macos-latest) (push) Has been cancelled
Test / test (1.23, ubuntu-24.04-arm) (push) Has been cancelled
Test / test (1.23, ubuntu-latest) (push) Has been cancelled
Test / test (1.23, windows-latest) (push) Has been cancelled
Test / test (1.24, macos-13) (push) Has been cancelled
Test / test (1.24, macos-latest) (push) Has been cancelled
Test / test (1.24, ubuntu-24.04-arm) (push) Has been cancelled
Test / test (1.24, ubuntu-latest) (push) Has been cancelled
Test / test (1.24, windows-latest) (push) Has been cancelled
Test / test (1.25, macos-13) (push) Has been cancelled
Test / test (1.25, macos-latest) (push) Has been cancelled
Test / test (1.25, ubuntu-24.04-arm) (push) Has been cancelled
Test / test (1.25, ubuntu-latest) (push) Has been cancelled
Test / test (1.25, windows-latest) (push) Has been cancelled
Trigger CMFA Update / trigger-CMFA-update (push) Has been cancelled

This commit is contained in:
wwqgtxx 2025-09-29 11:22:05 +08:00
parent 94b591ed44
commit 40e0813869
7 changed files with 72 additions and 72 deletions

View File

@ -6,15 +6,15 @@ import (
D "github.com/miekg/dns" D "github.com/miekg/dns"
) )
var DefaultLocalServer LocalServer var DefaultService Service
type LocalServer interface { type Service interface {
ServeMsg(ctx context.Context, msg *D.Msg) (*D.Msg, error) ServeMsg(ctx context.Context, msg *D.Msg) (*D.Msg, error)
} }
// ServeMsg with a dns.Msg, return resolve dns.Msg // ServeMsg with a dns.Msg, return resolve dns.Msg
func ServeMsg(ctx context.Context, msg *D.Msg) (*D.Msg, error) { func ServeMsg(ctx context.Context, msg *D.Msg) (*D.Msg, error) {
if server := DefaultLocalServer; server != nil { if server := DefaultService; server != nil {
return server.ServeMsg(ctx, msg) return server.ServeMsg(ctx, msg)
} }

View File

@ -2,10 +2,10 @@ package context
import ( import (
"context" "context"
"github.com/metacubex/mihomo/common/utils" "github.com/metacubex/mihomo/common/utils"
"github.com/gofrs/uuid/v5" "github.com/gofrs/uuid/v5"
"github.com/miekg/dns"
) )
const ( const (
@ -18,16 +18,14 @@ type DNSContext struct {
context.Context context.Context
id uuid.UUID id uuid.UUID
msg *dns.Msg
tp string tp string
} }
func NewDNSContext(ctx context.Context, msg *dns.Msg) *DNSContext { func NewDNSContext(ctx context.Context) *DNSContext {
return &DNSContext{ return &DNSContext{
Context: ctx, Context: ctx,
id: utils.NewUUIDV4(), id: utils.NewUUIDV4(),
msg: msg,
} }
} }

View File

@ -1,20 +0,0 @@
package dns
import (
"context"
D "github.com/miekg/dns"
)
type LocalServer struct {
handler handler
}
// ServeMsg implement resolver.LocalServer ResolveMsg
func (s *LocalServer) ServeMsg(ctx context.Context, msg *D.Msg) (*D.Msg, error) {
return handlerWithContext(ctx, s.handler, msg)
}
func NewLocalServer(resolver *Resolver, mapper *ResolverEnhancer) *LocalServer {
return &LocalServer{handler: NewHandler(resolver, mapper)}
}

View File

@ -7,22 +7,22 @@ import (
"github.com/metacubex/mihomo/common/lru" "github.com/metacubex/mihomo/common/lru"
"github.com/metacubex/mihomo/component/fakeip" "github.com/metacubex/mihomo/component/fakeip"
R "github.com/metacubex/mihomo/component/resolver" "github.com/metacubex/mihomo/component/resolver"
C "github.com/metacubex/mihomo/constant" C "github.com/metacubex/mihomo/constant"
"github.com/metacubex/mihomo/context" icontext "github.com/metacubex/mihomo/context"
"github.com/metacubex/mihomo/log" "github.com/metacubex/mihomo/log"
D "github.com/miekg/dns" D "github.com/miekg/dns"
) )
type ( type (
handler func(ctx *context.DNSContext, r *D.Msg) (*D.Msg, error) handler func(ctx *icontext.DNSContext, r *D.Msg) (*D.Msg, error)
middleware func(next handler) handler middleware func(next handler) handler
) )
func withHosts(mapping *lru.LruCache[netip.Addr, string]) middleware { func withHosts(mapping *lru.LruCache[netip.Addr, string]) middleware {
return func(next handler) handler { return func(next handler) handler {
return func(ctx *context.DNSContext, r *D.Msg) (*D.Msg, error) { return func(ctx *icontext.DNSContext, r *D.Msg) (*D.Msg, error) {
q := r.Question[0] q := r.Question[0]
if !isIPRequest(q) { if !isIPRequest(q) {
@ -36,7 +36,7 @@ func withHosts(mapping *lru.LruCache[netip.Addr, string]) middleware {
rr.Target = domain + "." rr.Target = domain + "."
resp.Answer = append([]D.RR{rr}, resp.Answer...) resp.Answer = append([]D.RR{rr}, resp.Answer...)
} }
record, ok := R.DefaultHosts.Search(host, q.Qtype != D.TypeA && q.Qtype != D.TypeAAAA) record, ok := resolver.DefaultHosts.Search(host, q.Qtype != D.TypeA && q.Qtype != D.TypeAAAA)
if !ok { if !ok {
if record != nil && record.IsDomain { if record != nil && record.IsDomain {
// replace request domain // replace request domain
@ -88,7 +88,7 @@ func withHosts(mapping *lru.LruCache[netip.Addr, string]) middleware {
return next(ctx, r) return next(ctx, r)
} }
ctx.SetType(context.DNSTypeHost) ctx.SetType(icontext.DNSTypeHost)
msg.SetRcode(r, D.RcodeSuccess) msg.SetRcode(r, D.RcodeSuccess)
msg.Authoritative = true msg.Authoritative = true
msg.RecursionAvailable = true msg.RecursionAvailable = true
@ -99,7 +99,7 @@ func withHosts(mapping *lru.LruCache[netip.Addr, string]) middleware {
func withMapping(mapping *lru.LruCache[netip.Addr, string]) middleware { func withMapping(mapping *lru.LruCache[netip.Addr, string]) middleware {
return func(next handler) handler { return func(next handler) handler {
return func(ctx *context.DNSContext, r *D.Msg) (*D.Msg, error) { return func(ctx *icontext.DNSContext, r *D.Msg) (*D.Msg, error) {
q := r.Question[0] q := r.Question[0]
if !isIPRequest(q) { if !isIPRequest(q) {
@ -149,7 +149,7 @@ func withMapping(mapping *lru.LruCache[netip.Addr, string]) middleware {
func withFakeIP(fakePool *fakeip.Pool) middleware { func withFakeIP(fakePool *fakeip.Pool) middleware {
return func(next handler) handler { return func(next handler) handler {
return func(ctx *context.DNSContext, r *D.Msg) (*D.Msg, error) { return func(ctx *icontext.DNSContext, r *D.Msg) (*D.Msg, error) {
q := r.Question[0] q := r.Question[0]
host := strings.TrimRight(q.Name, ".") host := strings.TrimRight(q.Name, ".")
@ -173,7 +173,7 @@ func withFakeIP(fakePool *fakeip.Pool) middleware {
msg := r.Copy() msg := r.Copy()
msg.Answer = []D.RR{rr} msg.Answer = []D.RR{rr}
ctx.SetType(context.DNSTypeFakeIP) ctx.SetType(icontext.DNSTypeFakeIP)
setMsgTTL(msg, 1) setMsgTTL(msg, 1)
msg.SetRcode(r, D.RcodeSuccess) msg.SetRcode(r, D.RcodeSuccess)
msg.Authoritative = true msg.Authoritative = true
@ -185,8 +185,8 @@ func withFakeIP(fakePool *fakeip.Pool) middleware {
} }
func withResolver(resolver *Resolver) handler { func withResolver(resolver *Resolver) handler {
return func(ctx *context.DNSContext, r *D.Msg) (*D.Msg, error) { return func(ctx *icontext.DNSContext, r *D.Msg) (*D.Msg, error) {
ctx.SetType(context.DNSTypeRaw) ctx.SetType(icontext.DNSTypeRaw)
q := r.Question[0] q := r.Question[0]
@ -218,8 +218,8 @@ func compose(middlewares []middleware, endpoint handler) handler {
return h return h
} }
func NewHandler(resolver *Resolver, mapper *ResolverEnhancer) handler { func newHandler(resolver *Resolver, mapper *ResolverEnhancer) handler {
middlewares := []middleware{} var middlewares []middleware
if mapper.useHosts { if mapper.useHosts {
middlewares = append(middlewares, withHosts(mapper.mapping)) middlewares = append(middlewares, withHosts(mapper.mapping))

View File

@ -1,13 +1,12 @@
package dns package dns
import ( import (
stdContext "context" "context"
"errors"
"net" "net"
"github.com/metacubex/mihomo/adapter/inbound" "github.com/metacubex/mihomo/adapter/inbound"
"github.com/metacubex/mihomo/common/sockopt" "github.com/metacubex/mihomo/common/sockopt"
"github.com/metacubex/mihomo/context" "github.com/metacubex/mihomo/component/resolver"
"github.com/metacubex/mihomo/log" "github.com/metacubex/mihomo/log"
D "github.com/miekg/dns" D "github.com/miekg/dns"
@ -21,39 +20,32 @@ var (
) )
type Server struct { type Server struct {
handler handler service resolver.Service
tcpServer *D.Server tcpServer *D.Server
udpServer *D.Server udpServer *D.Server
} }
// ServeDNS implement D.Handler ServeDNS // ServeDNS implement D.Handler ServeDNS
func (s *Server) ServeDNS(w D.ResponseWriter, r *D.Msg) { func (s *Server) ServeDNS(w D.ResponseWriter, r *D.Msg) {
msg, err := handlerWithContext(stdContext.Background(), s.handler, r) msg, err := s.service.ServeMsg(context.Background(), r)
if err != nil { if err != nil {
D.HandleFailed(w, r) m := new(D.Msg)
m.SetRcode(r, D.RcodeServerFailure)
// does not matter if this write fails
w.WriteMsg(m)
return return
} }
msg.Compress = true msg.Compress = true
w.WriteMsg(msg) w.WriteMsg(msg)
} }
func handlerWithContext(stdCtx stdContext.Context, handler handler, msg *D.Msg) (*D.Msg, error) { func (s *Server) SetService(service resolver.Service) {
if len(msg.Question) == 0 { s.service = service
return nil, errors.New("at least one question is required")
}
ctx := context.NewDNSContext(stdCtx, msg)
return handler(ctx, msg)
} }
func (s *Server) SetHandler(handler handler) { func ReCreateServer(addr string, service resolver.Service) {
s.handler = handler if addr == address && service != nil {
} server.SetService(service)
func ReCreateServer(addr string, resolver *Resolver, mapper *ResolverEnhancer) {
if addr == address && resolver != nil && mapper != nil {
handler := NewHandler(resolver, mapper)
server.SetHandler(handler)
return return
} }
@ -67,10 +59,10 @@ func ReCreateServer(addr string, resolver *Resolver, mapper *ResolverEnhancer) {
server.udpServer = nil server.udpServer = nil
} }
server.handler = nil server.service = nil
address = "" address = ""
if addr == "" || resolver == nil || mapper == nil { if addr == "" || service == nil {
return return
} }
@ -87,8 +79,7 @@ func ReCreateServer(addr string, resolver *Resolver, mapper *ResolverEnhancer) {
} }
address = addr address = addr
handler := NewHandler(resolver, mapper) server = &Server{service: service}
server = &Server{handler: handler}
go func() { go func() {
p, err := inbound.ListenPacket("udp", addr) p, err := inbound.ListenPacket("udp", addr)

29
dns/service.go Normal file
View File

@ -0,0 +1,29 @@
package dns
import (
"context"
"errors"
"github.com/metacubex/mihomo/component/resolver"
icontext "github.com/metacubex/mihomo/context"
D "github.com/miekg/dns"
)
type Service struct {
handler handler
}
// ServeMsg implement [resolver.Service] ResolveMsg
func (s *Service) ServeMsg(ctx context.Context, msg *D.Msg) (*D.Msg, error) {
if len(msg.Question) == 0 {
return nil, errors.New("at least one question is required")
}
return s.handler(icontext.NewDNSContext(ctx), msg)
}
var _ resolver.Service = (*Service)(nil)
func NewService(resolver *Resolver, mapper *ResolverEnhancer) *Service {
return &Service{handler: newHandler(resolver, mapper)}
}

View File

@ -240,10 +240,10 @@ func updateDNS(c *config.DNS, generalIPv6 bool) {
if !c.Enable { if !c.Enable {
resolver.DefaultResolver = nil resolver.DefaultResolver = nil
resolver.DefaultHostMapper = nil resolver.DefaultHostMapper = nil
resolver.DefaultLocalServer = nil resolver.DefaultService = nil
resolver.ProxyServerHostResolver = nil resolver.ProxyServerHostResolver = nil
resolver.DirectHostResolver = nil resolver.DirectHostResolver = nil
dns.ReCreateServer("", nil, nil) dns.ReCreateServer("", nil)
return return
} }
@ -273,9 +273,11 @@ func updateDNS(c *config.DNS, generalIPv6 bool) {
m.PatchFrom(old.(*dns.ResolverEnhancer)) m.PatchFrom(old.(*dns.ResolverEnhancer))
} }
s := dns.NewService(r.Resolver, m)
resolver.DefaultResolver = r resolver.DefaultResolver = r
resolver.DefaultHostMapper = m resolver.DefaultHostMapper = m
resolver.DefaultLocalServer = dns.NewLocalServer(r.Resolver, m) resolver.DefaultService = s
resolver.UseSystemHosts = c.UseSystemHosts resolver.UseSystemHosts = c.UseSystemHosts
if r.ProxyResolver.Invalid() { if r.ProxyResolver.Invalid() {
@ -290,7 +292,7 @@ func updateDNS(c *config.DNS, generalIPv6 bool) {
resolver.DirectHostResolver = r.Resolver resolver.DirectHostResolver = r.Resolver
} }
dns.ReCreateServer(c.Listen, r.Resolver, m) dns.ReCreateServer(c.Listen, s)
} }
func updateHosts(tree *trie.DomainTrie[resolver.HostValue]) { func updateHosts(tree *trie.DomainTrie[resolver.HostValue]) {