Add JSON schema support

This commit is contained in:
世界
2026-07-24 18:15:14 +08:00
parent 0b54f57725
commit db4bb985ce
89 changed files with 19325 additions and 305 deletions
+20 -4
View File
@@ -1623,8 +1623,10 @@ func dnsRuleActionDisablesLegacyDNSMode(action option.DNSRuleAction) bool {
return true
}
switch action.Action {
case "", C.RuleActionTypeRoute, C.RuleActionTypeEvaluate:
case "", C.RuleActionTypeRoute:
return action.RouteOptions.DisableOptimisticCache || action.RouteOptions.Speculative
case C.RuleActionTypeEvaluate:
return action.EvaluateOptions.DisableOptimisticCache || action.EvaluateOptions.Speculative
case C.RuleActionTypeRouteOptions:
return action.RouteOptionsOptions.DisableOptimisticCache
default:
@@ -1634,8 +1636,10 @@ func dnsRuleActionDisablesLegacyDNSMode(action option.DNSRuleAction) bool {
func dnsRuleActionHasStrategy(action option.DNSRuleAction) bool {
switch action.Action {
case "", C.RuleActionTypeRoute, C.RuleActionTypeEvaluate:
case "", C.RuleActionTypeRoute:
return C.DomainStrategy(action.RouteOptions.Strategy) != C.DomainStrategyAsIS
case C.RuleActionTypeEvaluate:
return C.DomainStrategy(action.EvaluateOptions.Strategy) != C.DomainStrategyAsIS
case C.RuleActionTypeRouteOptions:
return C.DomainStrategy(action.RouteOptionsOptions.Strategy) != C.DomainStrategyAsIS
default:
@@ -1663,8 +1667,14 @@ func dnsRuleActionType(rule option.DNSRule) string {
func dnsRuleActionServer(rule option.DNSRule) string {
switch rule.Type {
case "", C.RuleTypeDefault:
if dnsRuleActionType(rule) == C.RuleActionTypeEvaluate {
return rule.DefaultOptions.EvaluateOptions.Server
}
return rule.DefaultOptions.RouteOptions.Server
case C.RuleTypeLogical:
if dnsRuleActionType(rule) == C.RuleActionTypeEvaluate {
return rule.LogicalOptions.EvaluateOptions.Server
}
return rule.LogicalOptions.RouteOptions.Server
default:
return ""
@@ -1674,9 +1684,9 @@ func dnsRuleActionServer(rule option.DNSRule) string {
func dnsRuleActionEvaluateTag(rule option.DNSRule) string {
switch rule.Type {
case "", C.RuleTypeDefault:
return rule.DefaultOptions.RouteOptions.Tag
return rule.DefaultOptions.EvaluateOptions.Tag
case C.RuleTypeLogical:
return rule.LogicalOptions.RouteOptions.Tag
return rule.LogicalOptions.EvaluateOptions.Tag
default:
return ""
}
@@ -1685,8 +1695,14 @@ func dnsRuleActionEvaluateTag(rule option.DNSRule) string {
func dnsRuleActionSpeculative(rule option.DNSRule) bool {
switch rule.Type {
case "", C.RuleTypeDefault:
if dnsRuleActionType(rule) == C.RuleActionTypeEvaluate {
return rule.DefaultOptions.EvaluateOptions.Speculative
}
return rule.DefaultOptions.RouteOptions.Speculative
case C.RuleTypeLogical:
if dnsRuleActionType(rule) == C.RuleActionTypeEvaluate {
return rule.LogicalOptions.EvaluateOptions.Speculative
}
return rule.LogicalOptions.RouteOptions.Speculative
default:
return false
+1 -1
View File
@@ -174,7 +174,7 @@ func evaluateRule(server string, tag string, speculative bool) option.DNSRule {
DefaultOptions: option.DefaultDNSRule{
DNSRuleAction: option.DNSRuleAction{
Action: C.RuleActionTypeEvaluate,
RouteOptions: option.DNSRouteActionOptions{
EvaluateOptions: option.DNSEvaluateActionOptions{
Server: server,
Tag: tag,
Speculative: speculative,
+4 -2
View File
@@ -328,8 +328,10 @@ func (t *DBusResolvedResolver) checkResolved(ctx context.Context) (*resolvedServ
return nil, E.New("link has no DNS servers configured")
}
serverDialer, err := dialer.NewDefault(t.ctx, option.DialerOptions{
BindInterface: defaultInterface.Name,
UDPFragmentDefault: true,
AbstractDialerOptions: option.AbstractDialerOptions{
BindInterface: defaultInterface.Name,
UDPFragmentDefault: true,
},
})
if err != nil {
return nil, err
+8
View File
@@ -2,6 +2,8 @@ package dns
import (
"context"
"maps"
"slices"
"sync"
"github.com/sagernet/sing-box/adapter"
@@ -44,6 +46,12 @@ func NewTransportRegistry() *TransportRegistry {
}
}
func (r *TransportRegistry) OptionTypes() []string {
r.access.Lock()
defer r.access.Unlock()
return slices.Sorted(maps.Keys(r.optionsType))
}
func (r *TransportRegistry) CreateOptions(transportType string) (any, bool) {
r.access.Lock()
defer r.access.Unlock()