mirror of
https://github.com/MetaCubeX/mihomo.git
synced 2025-12-19 08:20:05 +08:00
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
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:
parent
94b591ed44
commit
40e0813869
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -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 (
|
||||||
@ -17,17 +17,15 @@ const (
|
|||||||
type DNSContext struct {
|
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,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
20
dns/local.go
20
dns/local.go
@ -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)}
|
|
||||||
}
|
|
||||||
@ -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))
|
||||||
|
|||||||
@ -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
29
dns/service.go
Normal 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)}
|
||||||
|
}
|
||||||
@ -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]) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user