diff --git a/okhttp-dnsoverhttps/src/main/kotlin/okhttp3/dnsoverhttps/internal/-DnsMessageWriter.kt b/okhttp-dnsoverhttps/src/main/kotlin/okhttp3/dnsoverhttps/internal/-DnsMessageWriter.kt index 19893684100f..45fba6da6b03 100644 --- a/okhttp-dnsoverhttps/src/main/kotlin/okhttp3/dnsoverhttps/internal/-DnsMessageWriter.kt +++ b/okhttp-dnsoverhttps/src/main/kotlin/okhttp3/dnsoverhttps/internal/-DnsMessageWriter.kt @@ -21,6 +21,19 @@ import java.net.Inet4Address import java.net.Inet6Address import okhttp3.Protocol import okhttp3.internal.OkHttpInternalApi +import okhttp3.internal.dns.CLASS_IN +import okhttp3.internal.dns.DnsMessage +import okhttp3.internal.dns.Question +import okhttp3.internal.dns.ResourceRecord +import okhttp3.internal.dns.SERVICE_PARAMETER_ALPN +import okhttp3.internal.dns.SERVICE_PARAMETER_ECH +import okhttp3.internal.dns.SERVICE_PARAMETER_IPV4_HINT +import okhttp3.internal.dns.SERVICE_PARAMETER_IPV6_HINT +import okhttp3.internal.dns.SERVICE_PARAMETER_NO_DEFAULT_ALPN +import okhttp3.internal.dns.SERVICE_PARAMETER_PORT +import okhttp3.internal.dns.TYPE_A +import okhttp3.internal.dns.TYPE_AAAA +import okhttp3.internal.dns.TYPE_HTTPS import okio.Buffer import okio.ByteString import okio.ByteString.Companion.encodeUtf8 diff --git a/okhttp-dnsoverhttps/src/main/kotlin/okhttp3/dnsoverhttps/internal/-DnsOverHttpsCall.kt b/okhttp-dnsoverhttps/src/main/kotlin/okhttp3/dnsoverhttps/internal/-DnsOverHttpsCall.kt index 78e2c5166e49..023b238c838b 100644 --- a/okhttp-dnsoverhttps/src/main/kotlin/okhttp3/dnsoverhttps/internal/-DnsOverHttpsCall.kt +++ b/okhttp-dnsoverhttps/src/main/kotlin/okhttp3/dnsoverhttps/internal/-DnsOverHttpsCall.kt @@ -18,15 +18,24 @@ package okhttp3.dnsoverhttps.internal import java.io.IOException +import java.net.ProtocolException import okhttp3.Call import okhttp3.Callback import okhttp3.Dns import okhttp3.HttpUrl import okhttp3.OkHttpClient +import okhttp3.Protocol import okhttp3.Request +import okhttp3.RequestBody import okhttp3.Response import okhttp3.dnsoverhttps.DnsOverHttps.Companion.DNS_MESSAGE +import okhttp3.dnsoverhttps.DnsOverHttps.Companion.MAX_RESPONSE_SIZE import okhttp3.internal.OkHttpInternalApi +import okhttp3.internal.dns.DnsMessage +import okhttp3.internal.dns.DnsMessageReader +import okhttp3.internal.platform.Platform +import okio.Buffer +import okio.BufferedSink // TODO: in-memory caching that uses timeToLive. // TODO: honor Https.priority and Https.targetName. Create new calls! @@ -123,3 +132,46 @@ internal class DnsOverHttpsCall( override fun isCanceled() = stateMachine.canceled } + +internal fun DnsMessage.asQueryParameter(): String { + val buffer = Buffer() + DnsMessageWriter(buffer).write(this@asQueryParameter) + return buffer.readByteString().base64Url().replace("=", "") +} + +internal class QueryRequestBody( + private val query: DnsMessage, +) : RequestBody() { + override fun contentType() = DNS_MESSAGE + + override fun writeTo(sink: BufferedSink) { + DnsMessageWriter(sink.buffer).write(query) + sink.emitCompleteSegments() + } +} + +@Throws(IOException::class) +internal fun decodeResponse(response: Response): DnsMessage { + if ( + response.cacheResponse == null && + response.protocol !== Protocol.HTTP_2 && + response.protocol !== Protocol.QUIC + ) { + Platform.get().log("Unexpected protocol: ${response.protocol}", Platform.WARN) + } + + response.use { + if (!response.isSuccessful) { + throw IOException("response: ${response.code} ${response.message}") + } + + val body = response.body + if (body.contentLength() > MAX_RESPONSE_SIZE) { + throw ProtocolException( + "response size exceeds limit ($MAX_RESPONSE_SIZE bytes): ${body.contentLength()} bytes", + ) + } + + return DnsMessageReader(body.source()).read() + } +} diff --git a/okhttp-dnsoverhttps/src/main/kotlin/okhttp3/dnsoverhttps/internal/DnsCallStateMachine.kt b/okhttp-dnsoverhttps/src/main/kotlin/okhttp3/dnsoverhttps/internal/DnsCallStateMachine.kt index 5e906c90578f..f9c207eaa4cd 100644 --- a/okhttp-dnsoverhttps/src/main/kotlin/okhttp3/dnsoverhttps/internal/DnsCallStateMachine.kt +++ b/okhttp-dnsoverhttps/src/main/kotlin/okhttp3/dnsoverhttps/internal/DnsCallStateMachine.kt @@ -20,6 +20,13 @@ import java.net.UnknownHostException import java.util.concurrent.atomic.AtomicReference import okhttp3.Dns import okhttp3.Protocol +import okhttp3.internal.dns.DnsMessage +import okhttp3.internal.dns.RESPONSE_CODE_SERVER_FAILURE +import okhttp3.internal.dns.RESPONSE_CODE_SUCCESS +import okhttp3.internal.dns.ResourceRecord +import okhttp3.internal.dns.TYPE_A +import okhttp3.internal.dns.TYPE_AAAA +import okhttp3.internal.dns.TYPE_HTTPS /** * State machine for DNS calls. This is intended for use with any transport for the queries, such diff --git a/okhttp-dnsoverhttps/src/test/java/okhttp3/dnsoverhttps/DnsOverHttpsTest.kt b/okhttp-dnsoverhttps/src/test/java/okhttp3/dnsoverhttps/DnsOverHttpsTest.kt index c61bdcc3ff40..dc826b39e65b 100644 --- a/okhttp-dnsoverhttps/src/test/java/okhttp3/dnsoverhttps/DnsOverHttpsTest.kt +++ b/okhttp-dnsoverhttps/src/test/java/okhttp3/dnsoverhttps/DnsOverHttpsTest.kt @@ -52,14 +52,14 @@ import okhttp3.Interceptor import okhttp3.OkHttpClient import okhttp3.Protocol import okhttp3.Response -import okhttp3.dnsoverhttps.internal.CLASS_IN -import okhttp3.dnsoverhttps.internal.DnsMessage -import okhttp3.dnsoverhttps.internal.Question -import okhttp3.dnsoverhttps.internal.ResourceRecord -import okhttp3.dnsoverhttps.internal.TYPE_A -import okhttp3.dnsoverhttps.internal.TYPE_AAAA +import okhttp3.internal.dns.CLASS_IN import okhttp3.internal.dns.DnsEvent +import okhttp3.internal.dns.DnsMessage import okhttp3.internal.dns.EntryPoint +import okhttp3.internal.dns.Question +import okhttp3.internal.dns.ResourceRecord +import okhttp3.internal.dns.TYPE_A +import okhttp3.internal.dns.TYPE_AAAA import okhttp3.internal.dns.invoke import okhttp3.internal.dns.toEventsQueue import okhttp3.testing.PlatformRule diff --git a/okhttp-dnsoverhttps/src/test/java/okhttp3/dnsoverhttps/DnsRecordCodecTest.kt b/okhttp-dnsoverhttps/src/test/java/okhttp3/dnsoverhttps/DnsRecordCodecTest.kt index 0554f7a82122..89bebe07a910 100644 --- a/okhttp-dnsoverhttps/src/test/java/okhttp3/dnsoverhttps/DnsRecordCodecTest.kt +++ b/okhttp-dnsoverhttps/src/test/java/okhttp3/dnsoverhttps/DnsRecordCodecTest.kt @@ -22,13 +22,13 @@ import assertk.assertions.isEqualTo import java.net.InetAddress import java.net.UnknownHostException import kotlin.test.assertFailsWith -import okhttp3.dnsoverhttps.internal.DnsMessage -import okhttp3.dnsoverhttps.internal.DnsMessageReader -import okhttp3.dnsoverhttps.internal.RESPONSE_CODE_SUCCESS -import okhttp3.dnsoverhttps.internal.ResourceRecord -import okhttp3.dnsoverhttps.internal.TYPE_A -import okhttp3.dnsoverhttps.internal.TYPE_AAAA import okhttp3.dnsoverhttps.internal.asQueryParameter +import okhttp3.internal.dns.DnsMessage +import okhttp3.internal.dns.DnsMessageReader +import okhttp3.internal.dns.RESPONSE_CODE_SUCCESS +import okhttp3.internal.dns.ResourceRecord +import okhttp3.internal.dns.TYPE_A +import okhttp3.internal.dns.TYPE_AAAA import okio.Buffer import okio.ByteString import okio.ByteString.Companion.decodeHex diff --git a/okhttp-dnsoverhttps/src/test/java/okhttp3/dnsoverhttps/internal/DnsMessageReaderRecordedValuesTest.kt b/okhttp-dnsoverhttps/src/test/java/okhttp3/dnsoverhttps/internal/DnsMessageReaderRecordedValuesTest.kt index 1d17f575aba3..f3a62393aa49 100644 --- a/okhttp-dnsoverhttps/src/test/java/okhttp3/dnsoverhttps/internal/DnsMessageReaderRecordedValuesTest.kt +++ b/okhttp-dnsoverhttps/src/test/java/okhttp3/dnsoverhttps/internal/DnsMessageReaderRecordedValuesTest.kt @@ -20,6 +20,12 @@ import assertk.assertions.containsExactly import assertk.assertions.isEqualTo import java.net.InetAddress import kotlin.test.Test +import okhttp3.internal.dns.DnsMessage +import okhttp3.internal.dns.DnsMessageReader +import okhttp3.internal.dns.Question +import okhttp3.internal.dns.ResourceRecord +import okhttp3.internal.dns.TYPE_A +import okhttp3.internal.dns.TYPE_AAAA import okio.Buffer import okio.ByteString.Companion.decodeHex diff --git a/okhttp-dnsoverhttps/src/test/java/okhttp3/dnsoverhttps/internal/DnsMessageReaderWriterTest.kt b/okhttp-dnsoverhttps/src/test/java/okhttp3/dnsoverhttps/internal/DnsMessageReaderWriterTest.kt index f2b500338abc..21ff1b936388 100644 --- a/okhttp-dnsoverhttps/src/test/java/okhttp3/dnsoverhttps/internal/DnsMessageReaderWriterTest.kt +++ b/okhttp-dnsoverhttps/src/test/java/okhttp3/dnsoverhttps/internal/DnsMessageReaderWriterTest.kt @@ -22,6 +22,13 @@ import java.net.InetAddress import java.net.ProtocolException import kotlin.test.Test import kotlin.test.assertFailsWith +import okhttp3.internal.dns.DnsMessage +import okhttp3.internal.dns.DnsMessageReader +import okhttp3.internal.dns.Question +import okhttp3.internal.dns.ResourceRecord +import okhttp3.internal.dns.TYPE_A +import okhttp3.internal.dns.TYPE_AAAA +import okhttp3.internal.dns.TYPE_HTTPS import okio.Buffer import okio.ByteString.Companion.decodeHex diff --git a/okhttp-testing-support/src/main/kotlin/okhttp3/FakeDns.kt b/okhttp-testing-support/src/main/kotlin/okhttp3/FakeDns.kt index 7cb0d737d73d..d14be33cabae 100644 --- a/okhttp-testing-support/src/main/kotlin/okhttp3/FakeDns.kt +++ b/okhttp-testing-support/src/main/kotlin/okhttp3/FakeDns.kt @@ -28,16 +28,16 @@ import java.util.concurrent.atomic.AtomicInteger import mockwebserver3.Dispatcher import mockwebserver3.MockResponse import mockwebserver3.RecordedRequest -import okhttp3.dnsoverhttps.internal.CLASS_IN -import okhttp3.dnsoverhttps.internal.DnsMessage -import okhttp3.dnsoverhttps.internal.DnsMessageReader import okhttp3.dnsoverhttps.internal.DnsMessageWriter -import okhttp3.dnsoverhttps.internal.Question -import okhttp3.dnsoverhttps.internal.ResourceRecord -import okhttp3.dnsoverhttps.internal.TYPE_A -import okhttp3.dnsoverhttps.internal.TYPE_AAAA -import okhttp3.dnsoverhttps.internal.TYPE_HTTPS import okhttp3.internal.concurrent.TaskRunner +import okhttp3.internal.dns.CLASS_IN +import okhttp3.internal.dns.DnsMessage +import okhttp3.internal.dns.DnsMessageReader +import okhttp3.internal.dns.Question +import okhttp3.internal.dns.ResourceRecord +import okhttp3.internal.dns.TYPE_A +import okhttp3.internal.dns.TYPE_AAAA +import okhttp3.internal.dns.TYPE_HTTPS import okio.Buffer import okio.ByteString.Companion.decodeBase64 diff --git a/okhttp-dnsoverhttps/src/main/kotlin/okhttp3/dnsoverhttps/internal/-DnsMessage.kt b/okhttp/src/commonJvmAndroid/kotlin/okhttp3/internal/dns/-DnsMessage.kt similarity index 74% rename from okhttp-dnsoverhttps/src/main/kotlin/okhttp3/dnsoverhttps/internal/-DnsMessage.kt rename to okhttp/src/commonJvmAndroid/kotlin/okhttp3/internal/dns/-DnsMessage.kt index 64907ea65b5d..a0b1786cd96f 100644 --- a/okhttp-dnsoverhttps/src/main/kotlin/okhttp3/dnsoverhttps/internal/-DnsMessage.kt +++ b/okhttp/src/commonJvmAndroid/kotlin/okhttp3/internal/dns/-DnsMessage.kt @@ -15,20 +15,10 @@ */ @file:Suppress("ktlint:standard:filename") -package okhttp3.dnsoverhttps.internal +package okhttp3.internal.dns -import java.io.IOException import java.net.InetAddress -import java.net.ProtocolException -import okhttp3.Protocol -import okhttp3.RequestBody -import okhttp3.Response -import okhttp3.dnsoverhttps.DnsOverHttps.Companion.DNS_MESSAGE -import okhttp3.dnsoverhttps.DnsOverHttps.Companion.MAX_RESPONSE_SIZE import okhttp3.internal.OkHttpInternalApi -import okhttp3.internal.platform.Platform -import okio.Buffer -import okio.BufferedSink import okio.ByteString @OkHttpInternalApi @@ -166,46 +156,3 @@ internal const val SERVICE_PARAMETER_PORT = 3 internal const val SERVICE_PARAMETER_IPV4_HINT = 4 internal const val SERVICE_PARAMETER_ECH = 5 internal const val SERVICE_PARAMETER_IPV6_HINT = 6 - -internal fun DnsMessage.asQueryParameter(): String { - val buffer = Buffer() - DnsMessageWriter(buffer).write(this@asQueryParameter) - return buffer.readByteString().base64Url().replace("=", "") -} - -internal class QueryRequestBody( - private val query: DnsMessage, -) : RequestBody() { - override fun contentType() = DNS_MESSAGE - - override fun writeTo(sink: BufferedSink) { - DnsMessageWriter(sink.buffer).write(query) - sink.emitCompleteSegments() - } -} - -@Throws(IOException::class) -internal fun decodeResponse(response: Response): DnsMessage { - if ( - response.cacheResponse == null && - response.protocol !== Protocol.HTTP_2 && - response.protocol !== Protocol.QUIC - ) { - Platform.get().log("Unexpected protocol: ${response.protocol}", Platform.WARN) - } - - response.use { - if (!response.isSuccessful) { - throw IOException("response: ${response.code} ${response.message}") - } - - val body = response.body - if (body.contentLength() > MAX_RESPONSE_SIZE) { - throw ProtocolException( - "response size exceeds limit ($MAX_RESPONSE_SIZE bytes): ${body.contentLength()} bytes", - ) - } - - return DnsMessageReader(body.source()).read() - } -} diff --git a/okhttp-dnsoverhttps/src/main/kotlin/okhttp3/dnsoverhttps/internal/-DnsMessageReader.kt b/okhttp/src/commonJvmAndroid/kotlin/okhttp3/internal/dns/-DnsMessageReader.kt similarity index 98% rename from okhttp-dnsoverhttps/src/main/kotlin/okhttp3/dnsoverhttps/internal/-DnsMessageReader.kt rename to okhttp/src/commonJvmAndroid/kotlin/okhttp3/internal/dns/-DnsMessageReader.kt index 569fb67679cd..e58cf4969ebd 100644 --- a/okhttp-dnsoverhttps/src/main/kotlin/okhttp3/dnsoverhttps/internal/-DnsMessageReader.kt +++ b/okhttp/src/commonJvmAndroid/kotlin/okhttp3/internal/dns/-DnsMessageReader.kt @@ -15,16 +15,16 @@ */ @file:Suppress("ktlint:standard:filename") -package okhttp3.dnsoverhttps.internal +package okhttp3.internal.dns import java.net.InetAddress import okhttp3.Protocol import okhttp3.internal.OkHttpInternalApi +import okhttp3.internal.skipAll import okio.Buffer import okio.BufferedSource import okio.ByteString import okio.ForwardingSource -import okio.IOException import okio.ProtocolException import okio.Source import okio.buffer @@ -285,13 +285,6 @@ class DnsMessageReader( } } -@Throws(IOException::class) -internal fun BufferedSource.skipAll() { - while (!exhausted()) { - skip(buffer.size) - } -} - internal class FixedLengthSource( delegate: Source, private val size: Long, diff --git a/okhttp/src/jvmTest/kotlin/okhttp3/internal/connection/RouteSelectorTest.kt b/okhttp/src/jvmTest/kotlin/okhttp3/internal/connection/RouteSelectorTest.kt index 164c4d31a043..10ef278e2319 100644 --- a/okhttp/src/jvmTest/kotlin/okhttp3/internal/connection/RouteSelectorTest.kt +++ b/okhttp/src/jvmTest/kotlin/okhttp3/internal/connection/RouteSelectorTest.kt @@ -37,9 +37,9 @@ import okhttp3.OkHttpClientTestRule import okhttp3.Request import okhttp3.Route import okhttp3.TestValueFactory -import okhttp3.dnsoverhttps.internal.ResourceRecord import okhttp3.internal.connection.RouteSelector.Companion.socketHost import okhttp3.internal.dns.EntryPoint +import okhttp3.internal.dns.ResourceRecord import okhttp3.internal.dns.forceEntryPoint import okhttp3.internal.http.RecordingProxySelector import okhttp3.testing.PlatformRule