mirror of
https://github.com/SagerNet/sing-box.git
synced 2025-02-16 14:24:31 +00:00
Make dns.strategy take effect in dns exchange
This commit is contained in:
parent
a104d18277
commit
3c1190e2c3
|
@ -31,24 +31,32 @@ type Client struct {
|
||||||
cache *cache.LruCache[dnsmessage.Question, *dnsmessage.Message]
|
cache *cache.LruCache[dnsmessage.Question, *dnsmessage.Message]
|
||||||
disableCache bool
|
disableCache bool
|
||||||
disableExpire bool
|
disableExpire bool
|
||||||
|
strategy C.DomainStrategy
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewClient(options option.DNSClientOptions) *Client {
|
func NewClient(options option.DNSClientOptions) *Client {
|
||||||
if options.DisableCache {
|
client := &Client{
|
||||||
return &Client{
|
disableCache: options.DisableCache,
|
||||||
disableCache: true,
|
disableExpire: options.DisableExpire,
|
||||||
}
|
strategy: C.DomainStrategy(options.Strategy),
|
||||||
} else {
|
|
||||||
return &Client{
|
|
||||||
cache: cache.New[dnsmessage.Question, *dnsmessage.Message](),
|
|
||||||
disableExpire: options.DisableExpire,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if !options.DisableCache {
|
||||||
|
client.cache = cache.New[dnsmessage.Question, *dnsmessage.Message]()
|
||||||
|
}
|
||||||
|
return client
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Client) Exchange(ctx context.Context, transport adapter.DNSTransport, message *dnsmessage.Message) (*dnsmessage.Message, error) {
|
func (c *Client) Exchange(ctx context.Context, transport adapter.DNSTransport, message *dnsmessage.Message) (*dnsmessage.Message, error) {
|
||||||
if len(message.Questions) == 0 {
|
if len(message.Questions) != 1 {
|
||||||
return nil, E.New("empty query")
|
responseMessage := dnsmessage.Message{
|
||||||
|
Header: dnsmessage.Header{
|
||||||
|
ID: message.ID,
|
||||||
|
RCode: dnsmessage.RCodeFormatError,
|
||||||
|
Response: true,
|
||||||
|
RecursionDesired: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
return &responseMessage, nil
|
||||||
}
|
}
|
||||||
question := message.Questions[0]
|
question := message.Questions[0]
|
||||||
if !c.disableCache {
|
if !c.disableCache {
|
||||||
|
@ -64,6 +72,18 @@ func (c *Client) Exchange(ctx context.Context, transport adapter.DNSTransport, m
|
||||||
}
|
}
|
||||||
return nil, ErrNoRawSupport
|
return nil, ErrNoRawSupport
|
||||||
}
|
}
|
||||||
|
if question.Type == dnsmessage.TypeA && c.strategy == C.DomainStrategyUseIPv6 || question.Type == dnsmessage.TypeAAAA && c.strategy == C.DomainStrategyUseIPv4 {
|
||||||
|
responseMessage := dnsmessage.Message{
|
||||||
|
Header: dnsmessage.Header{
|
||||||
|
ID: message.ID,
|
||||||
|
RCode: dnsmessage.RCodeNameError,
|
||||||
|
Response: true,
|
||||||
|
RecursionDesired: true,
|
||||||
|
},
|
||||||
|
Questions: []dnsmessage.Question{question},
|
||||||
|
}
|
||||||
|
return &responseMessage, nil
|
||||||
|
}
|
||||||
messageId := message.ID
|
messageId := message.ID
|
||||||
response, err := transport.Exchange(ctx, message)
|
response, err := transport.Exchange(ctx, message)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -9,10 +9,9 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type DNSOptions struct {
|
type DNSOptions struct {
|
||||||
Servers []DNSServerOptions `json:"servers,omitempty"`
|
Servers []DNSServerOptions `json:"servers,omitempty"`
|
||||||
Rules []DNSRule `json:"rules,omitempty"`
|
Rules []DNSRule `json:"rules,omitempty"`
|
||||||
Final string `json:"final,omitempty"`
|
Final string `json:"final,omitempty"`
|
||||||
Strategy DomainStrategy `json:"strategy,omitempty"`
|
|
||||||
DNSClientOptions
|
DNSClientOptions
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,13 +19,13 @@ func (o DNSOptions) Equals(other DNSOptions) bool {
|
||||||
return common.ComparableSliceEquals(o.Servers, other.Servers) &&
|
return common.ComparableSliceEquals(o.Servers, other.Servers) &&
|
||||||
common.SliceEquals(o.Rules, other.Rules) &&
|
common.SliceEquals(o.Rules, other.Rules) &&
|
||||||
o.Final == other.Final &&
|
o.Final == other.Final &&
|
||||||
o.Strategy == other.Strategy &&
|
|
||||||
o.DNSClientOptions == other.DNSClientOptions
|
o.DNSClientOptions == other.DNSClientOptions
|
||||||
}
|
}
|
||||||
|
|
||||||
type DNSClientOptions struct {
|
type DNSClientOptions struct {
|
||||||
DisableCache bool `json:"disable_cache,omitempty"`
|
Strategy DomainStrategy `json:"strategy,omitempty"`
|
||||||
DisableExpire bool `json:"disable_expire,omitempty"`
|
DisableCache bool `json:"disable_cache,omitempty"`
|
||||||
|
DisableExpire bool `json:"disable_expire,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type DNSServerOptions struct {
|
type DNSServerOptions struct {
|
||||||
|
|
Loading…
Reference in a new issue