Fix local DNS resolver
This commit is contained in:
@@ -34,7 +34,6 @@ import kotlinx.coroutines.Dispatchers
|
|||||||
import kotlinx.coroutines.GlobalScope
|
import kotlinx.coroutines.GlobalScope
|
||||||
import kotlinx.coroutines.channels.actor
|
import kotlinx.coroutines.channels.actor
|
||||||
import kotlinx.coroutines.runBlocking
|
import kotlinx.coroutines.runBlocking
|
||||||
import java.net.UnknownHostException
|
|
||||||
|
|
||||||
object DefaultNetworkListener {
|
object DefaultNetworkListener {
|
||||||
private sealed class NetworkMessage {
|
private sealed class NetworkMessage {
|
||||||
@@ -104,7 +103,7 @@ object DefaultNetworkListener {
|
|||||||
|
|
||||||
suspend fun get() = if (fallback) @TargetApi(23) {
|
suspend fun get() = if (fallback) @TargetApi(23) {
|
||||||
Application.connectivity.activeNetwork
|
Application.connectivity.activeNetwork
|
||||||
?: throw UnknownHostException() // failed to listen, return current if available
|
?: error("missing default network") // failed to listen, return current if available
|
||||||
} else NetworkMessage.Get().run {
|
} else NetworkMessage.Get().run {
|
||||||
networkActor.send(this)
|
networkActor.send(this)
|
||||||
response.await()
|
response.await()
|
||||||
|
|||||||
@@ -27,6 +27,14 @@ object DefaultNetworkMonitor {
|
|||||||
DefaultNetworkListener.stop(this)
|
DefaultNetworkListener.stop(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
suspend fun require(): Network {
|
||||||
|
val network = defaultNetwork
|
||||||
|
if (network != null) {
|
||||||
|
return network
|
||||||
|
}
|
||||||
|
return DefaultNetworkListener.get()
|
||||||
|
}
|
||||||
|
|
||||||
fun setListener(listener: InterfaceUpdateListener?) {
|
fun setListener(listener: InterfaceUpdateListener?) {
|
||||||
this.listener = listener
|
this.listener = listener
|
||||||
checkDefaultInterfaceUpdate(defaultNetwork)
|
checkDefaultInterfaceUpdate(defaultNetwork)
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ object LocalResolver : LocalDNSTransport {
|
|||||||
@RequiresApi(Build.VERSION_CODES.Q)
|
@RequiresApi(Build.VERSION_CODES.Q)
|
||||||
override fun exchange(ctx: ExchangeContext, message: ByteArray) {
|
override fun exchange(ctx: ExchangeContext, message: ByteArray) {
|
||||||
return runBlocking {
|
return runBlocking {
|
||||||
|
val defaultNetwork = DefaultNetworkMonitor.require()
|
||||||
suspendCoroutine { continuation ->
|
suspendCoroutine { continuation ->
|
||||||
val signal = CancellationSignal()
|
val signal = CancellationSignal()
|
||||||
ctx.onCancel(signal::cancel)
|
ctx.onCancel(signal::cancel)
|
||||||
@@ -52,7 +53,7 @@ object LocalResolver : LocalDNSTransport {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
DnsResolver.getInstance().rawQuery(
|
DnsResolver.getInstance().rawQuery(
|
||||||
DefaultNetworkMonitor.defaultNetwork,
|
defaultNetwork,
|
||||||
message,
|
message,
|
||||||
DnsResolver.FLAG_NO_RETRY,
|
DnsResolver.FLAG_NO_RETRY,
|
||||||
Dispatchers.IO.asExecutor(),
|
Dispatchers.IO.asExecutor(),
|
||||||
@@ -64,8 +65,9 @@ object LocalResolver : LocalDNSTransport {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun lookup(ctx: ExchangeContext, network: String, domain: String) {
|
override fun lookup(ctx: ExchangeContext, network: String, domain: String) {
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
return runBlocking {
|
||||||
return runBlocking {
|
val defaultNetwork = DefaultNetworkMonitor.require()
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
||||||
suspendCoroutine { continuation ->
|
suspendCoroutine { continuation ->
|
||||||
val signal = CancellationSignal()
|
val signal = CancellationSignal()
|
||||||
ctx.onCancel(signal::cancel)
|
ctx.onCancel(signal::cancel)
|
||||||
@@ -99,7 +101,7 @@ object LocalResolver : LocalDNSTransport {
|
|||||||
}
|
}
|
||||||
if (type != null) {
|
if (type != null) {
|
||||||
DnsResolver.getInstance().query(
|
DnsResolver.getInstance().query(
|
||||||
DefaultNetworkMonitor.defaultNetwork,
|
defaultNetwork,
|
||||||
domain,
|
domain,
|
||||||
type,
|
type,
|
||||||
DnsResolver.FLAG_NO_RETRY,
|
DnsResolver.FLAG_NO_RETRY,
|
||||||
@@ -109,7 +111,7 @@ object LocalResolver : LocalDNSTransport {
|
|||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
DnsResolver.getInstance().query(
|
DnsResolver.getInstance().query(
|
||||||
DefaultNetworkMonitor.defaultNetwork,
|
defaultNetwork,
|
||||||
domain,
|
domain,
|
||||||
DnsResolver.FLAG_NO_RETRY,
|
DnsResolver.FLAG_NO_RETRY,
|
||||||
Dispatchers.IO.asExecutor(),
|
Dispatchers.IO.asExecutor(),
|
||||||
@@ -118,17 +120,15 @@ object LocalResolver : LocalDNSTransport {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
val answer = try {
|
||||||
|
defaultNetwork.getAllByName(domain)
|
||||||
|
} catch (e: UnknownHostException) {
|
||||||
|
ctx.errorCode(RCODE_NXDOMAIN)
|
||||||
|
return@runBlocking
|
||||||
|
}
|
||||||
|
ctx.success(answer.mapNotNull { it.hostAddress }.joinToString("\n"))
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
val underlyingNetwork =
|
|
||||||
DefaultNetworkMonitor.defaultNetwork ?: error("upstream network not found")
|
|
||||||
val answer = try {
|
|
||||||
underlyingNetwork.getAllByName(domain)
|
|
||||||
} catch (e: UnknownHostException) {
|
|
||||||
ctx.errorCode(RCODE_NXDOMAIN)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
ctx.success(answer.mapNotNull { it.hostAddress }.joinToString("\n"))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user