diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/dto/V2rayConfig.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/dto/V2rayConfig.kt index aa749c31..f4dedf22 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/dto/V2rayConfig.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/dto/V2rayConfig.kt @@ -292,7 +292,8 @@ data class V2rayConfig( var tcpFastOpen: Boolean? = null, var tproxy: String? = null, var mark: Int? = null, - var dialerProxy: String? = null + var dialerProxy: String? = null, + var domainStrategy: String? = null ) data class TlsSettingsBean( @@ -507,6 +508,18 @@ data class V2rayConfig( } return null } + + fun ensureSockopt(): V2rayConfig.OutboundBean.StreamSettingsBean.SockoptBean { + val stream = streamSettings ?: V2rayConfig.OutboundBean.StreamSettingsBean().also { + streamSettings = it + } + + val sockopt = stream.sockopt ?: V2rayConfig.OutboundBean.StreamSettingsBean.SockoptBean().also { + stream.sockopt = it + } + + return sockopt + } } data class DnsBean( diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2rayConfigManager.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2rayConfigManager.kt index 18b130df..42ac0a3e 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2rayConfigManager.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2rayConfigManager.kt @@ -702,13 +702,7 @@ object V2rayConfigManager { updateOutboundWithGlobalSettings(prevOutbound) prevOutbound.tag = TAG_PROXY + "2" v2rayConfig.outbounds.add(prevOutbound) - if (outbound.streamSettings == null) { - outbound.streamSettings = V2rayConfig.OutboundBean.StreamSettingsBean() - } - outbound.streamSettings?.sockopt = - V2rayConfig.OutboundBean.StreamSettingsBean.SockoptBean( - dialerProxy = prevOutbound.tag - ) + outbound.ensureSockopt().dialerProxy = prevOutbound.tag domainPort = prevNode.getServerAddressAndPort() } } @@ -722,13 +716,7 @@ object V2rayConfigManager { nextOutbound.tag = TAG_PROXY v2rayConfig.outbounds.add(0, nextOutbound) outbound.tag = TAG_PROXY + "1" - if (nextOutbound.streamSettings == null) { - nextOutbound.streamSettings = V2rayConfig.OutboundBean.StreamSettingsBean() - } - nextOutbound.streamSettings?.sockopt = - V2rayConfig.OutboundBean.StreamSettingsBean.SockoptBean( - dialerProxy = outbound.tag - ) + nextOutbound.ensureSockopt().dialerProxy = outbound.tag if (nextNode.configType == EConfigType.WIREGUARD) { domainPort = nextNode.getServerAddressAndPort() } @@ -772,6 +760,8 @@ object V2rayConfigManager { val newHosts = dns.hosts?.toMutableMap() ?: mutableMapOf() + val preferIpv6 = MmkvManager.decodeSettingsBool(AppConfig.PREF_PREFER_IPV6) == true + for (item in proxyOutboundList) { val domain = item.getServerAddress() if (domain.isNullOrEmpty()) continue @@ -780,11 +770,14 @@ object V2rayConfigManager { val resolvedIps = HttpUtil.resolveHostToIP( domain, - MmkvManager.decodeSettingsBool(AppConfig.PREF_PREFER_IPV6) == true + preferIpv6 ) if (resolvedIps.isEmpty()) continue + item.ensureSockopt().domainStrategy = + if (preferIpv6) "UseIPv6v4" else "UseIPv4v6" + newHosts[domain] = if (resolvedIps.size == 1) { resolvedIps[0] } else {