Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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!
Expand Down Expand Up @@ -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()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
16 changes: 8 additions & 8 deletions okhttp-testing-support/src/main/kotlin/okhttp3/FakeDns.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down