@@ -24,8 +24,13 @@ import androidx.annotation.RequiresApi
24
24
import java.net.InetAddress
25
25
import java.net.UnknownHostException
26
26
import java.util.concurrent.Executors
27
- import okhttp3.AsyncDns
27
+ import okhttp3.Call
28
+ import okhttp3.Dns
28
29
import 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
29
34
30
35
/* *
31
36
* DNS implementation based on android.net.DnsResolver, which submits a request for
@@ -37,8 +42,8 @@ import okhttp3.ExperimentalOkHttpApi
37
42
*/
38
43
@RequiresApi(Build .VERSION_CODES .Q )
39
44
@ExperimentalOkHttpApi
40
- class AndroidAsyncDns (
41
- private val dnsClass : AsyncDns . DnsClass ,
45
+ internal class AndroidDns internal constructor (
46
+ private val dnsClass : DnsClass ,
42
47
private val network : Network ? = null ,
43
48
) : AsyncDns {
44
49
@RequiresApi(Build .VERSION_CODES .Q )
@@ -47,6 +52,7 @@ class AndroidAsyncDns(
47
52
48
53
override fun query (
49
54
hostname : String ,
55
+ originatingCall : Call ? ,
50
56
callback : AsyncDns .Callback ,
51
57
) {
52
58
try {
@@ -62,15 +68,17 @@ class AndroidAsyncDns(
62
68
addresses : List <InetAddress >,
63
69
rCode : Int ,
64
70
) {
65
- callback.onResponse( hostname, addresses)
71
+ callback.onAddresses(hasMore = false , hostname = hostname, addresses = addresses)
66
72
}
67
73
68
74
override fun onError (e : DnsResolver .DnsException ) {
69
75
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
+ },
74
82
)
75
83
}
76
84
},
@@ -79,6 +87,7 @@ class AndroidAsyncDns(
79
87
// Handle any errors that might leak out
80
88
// https://issuetracker.google.com/issues/319957694
81
89
callback.onFailure(
90
+ hasMore = false ,
82
91
hostname,
83
92
UnknownHostException (e.message).apply {
84
93
initCause(e)
@@ -89,10 +98,37 @@ class AndroidAsyncDns(
89
98
90
99
@ExperimentalOkHttpApi
91
100
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
+
92
108
@RequiresApi(Build .VERSION_CODES .Q )
93
- val IPv4 = AndroidAsyncDns (dnsClass = AsyncDns . DnsClass .IPV4 )
109
+ val IPv4 = AndroidDns (dnsClass = DnsClass .IPV4 )
94
110
95
111
@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 ),
97
126
}
98
127
}
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