@@ -24,8 +24,13 @@ import androidx.annotation.RequiresApi
2424import java.net.InetAddress
2525import java.net.UnknownHostException
2626import java.util.concurrent.Executors
27- import okhttp3.AsyncDns
27+ import okhttp3.Call
28+ import okhttp3.Dns
2829import okhttp3.ExperimentalOkHttpApi
30+ import okhttp3.android.AndroidDns.DnsClass
31+ import okhttp3.android.internal.AsyncDns
32+ import okhttp3.android.internal.BlockingAsyncDns.Companion.asBlocking
33+ import okhttp3.android.internal.CombinedAsyncDns.Companion.union
2934
3035/* *
3136 * DNS implementation based on android.net.DnsResolver, which submits a request for
@@ -37,8 +42,8 @@ import okhttp3.ExperimentalOkHttpApi
3742 */
3843@RequiresApi(Build .VERSION_CODES .Q )
3944@ExperimentalOkHttpApi
40- class AndroidAsyncDns (
41- private val dnsClass : AsyncDns . DnsClass ,
45+ internal class AndroidDns internal constructor (
46+ private val dnsClass : DnsClass ,
4247 private val network : Network ? = null ,
4348) : AsyncDns {
4449 @RequiresApi(Build .VERSION_CODES .Q )
@@ -47,6 +52,7 @@ class AndroidAsyncDns(
4752
4853 override fun query (
4954 hostname : String ,
55+ originatingCall : Call ? ,
5056 callback : AsyncDns .Callback ,
5157 ) {
5258 try {
@@ -62,15 +68,17 @@ class AndroidAsyncDns(
6268 addresses : List <InetAddress >,
6369 rCode : Int ,
6470 ) {
65- callback.onResponse( hostname, addresses)
71+ callback.onAddresses(hasMore = false , hostname = hostname, addresses = addresses)
6672 }
6773
6874 override fun onError (e : DnsResolver .DnsException ) {
6975 callback.onFailure(
70- hostname,
71- UnknownHostException (e.message).apply {
72- initCause(e)
73- },
76+ hasMore = false ,
77+ hostname = hostname,
78+ e =
79+ UnknownHostException (e.message).apply {
80+ initCause(e)
81+ },
7482 )
7583 }
7684 },
@@ -79,6 +87,7 @@ class AndroidAsyncDns(
7987 // Handle any errors that might leak out
8088 // https://issuetracker.google.com/issues/319957694
8189 callback.onFailure(
90+ hasMore = false ,
8291 hostname,
8392 UnknownHostException (e.message).apply {
8493 initCause(e)
@@ -89,10 +98,37 @@ class AndroidAsyncDns(
8998
9099 @ExperimentalOkHttpApi
91100 companion object {
101+ internal fun forNetwork (network : Network ): AsyncDns {
102+ return union(
103+ AndroidDns (dnsClass = DnsClass .IPV4 , network = network),
104+ AndroidDns (dnsClass = DnsClass .IPV6 , network = network),
105+ )
106+ }
107+
92108 @RequiresApi(Build .VERSION_CODES .Q )
93- val IPv4 = AndroidAsyncDns (dnsClass = AsyncDns . DnsClass .IPV4 )
109+ val IPv4 = AndroidDns (dnsClass = DnsClass .IPV4 )
94110
95111 @RequiresApi(Build .VERSION_CODES .Q )
96- val IPv6 = AndroidAsyncDns (dnsClass = AsyncDns .DnsClass .IPV6 )
112+ val IPv6 = AndroidDns (dnsClass = DnsClass .IPV6 )
113+
114+ internal const val TYPE_A = 1
115+ internal const val TYPE_AAAA = 28
116+ }
117+
118+ /* *
119+ * Class of DNS addresses, such that clients that treat these differently, such
120+ * as attempting IPv6 first, can make such decisions.
121+ */
122+ @ExperimentalOkHttpApi
123+ internal enum class DnsClass (val type : Int ) {
124+ IPV4 (TYPE_A ),
125+ IPV6 (TYPE_AAAA ),
97126 }
98127}
128+
129+ internal val Dns .Companion .ANDROID : Dns
130+ @RequiresApi(Build .VERSION_CODES .Q )
131+ get() = union(AndroidDns (dnsClass = DnsClass .IPV4 ), AndroidDns (dnsClass = DnsClass .IPV6 )).asBlocking()
132+
133+ @RequiresApi(Build .VERSION_CODES .Q )
134+ fun Dns.Companion.forNetwork (network : Network ): Dns = AndroidDns .forNetwork(network).asBlocking()
0 commit comments