Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 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 @@ -197,6 +197,7 @@ class TestValueFactory : Closeable {
connectTimeoutMillis = 10_000,
readTimeoutMillis = 10_000,
writeTimeoutMillis = 10_000,
clientOverrides = null,
)

fun newRoutePlanner(
Expand Down
5 changes: 5 additions & 0 deletions okhttp/src/commonJvmAndroid/kotlin/okhttp3/Interceptor.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ package okhttp3

import java.io.IOException
import java.util.concurrent.TimeUnit
import javax.net.SocketFactory

/**
* Observes, modifies, and potentially short-circuits requests going out and the corresponding
Expand Down Expand Up @@ -108,5 +109,9 @@ fun interface Interceptor {
timeout: Int,
unit: TimeUnit,
): Chain

fun withDns(dns: Dns?): Chain

fun withSocketFactory(socketFactory: SocketFactory?): Chain
}
}
1 change: 1 addition & 0 deletions okhttp/src/commonJvmAndroid/kotlin/okhttp3/OkHttpClient.kt
Original file line number Diff line number Diff line change
Expand Up @@ -312,6 +312,7 @@ open class OkHttpClient internal constructor(
* Creates an [Address] of out of the provided [HttpUrl]
* that uses this client’s DNS, TLS, and proxy configuration.
*/
@Deprecated("Not intended to be public API on OkHttpClient")
fun address(url: HttpUrl): Address {
var useSslSocketFactory: SSLSocketFactory? = null
var useHostnameVerifier: HostnameVerifier? = null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ class RealCall(
connectTimeoutMillis = client.connectTimeoutMillis,
readTimeoutMillis = client.readTimeoutMillis,
writeTimeoutMillis = client.writeTimeoutMillis,
clientOverrides = null,
)

var calledNoMoreExchanges = false
Expand Down Expand Up @@ -256,7 +257,7 @@ class RealCall(
pingIntervalMillis = client.pingIntervalMillis,
retryOnConnectionFailure = client.retryOnConnectionFailure,
fastFallback = client.fastFallback,
address = client.address(request.url),
address = chain.address(request.url),
connectionUser = CallConnectionUser(this, connectionPool.connectionListener, chain),
routeDatabase = client.routeDatabase,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,15 @@ package okhttp3.internal.http

import java.io.IOException
import java.util.concurrent.TimeUnit
import javax.net.SocketFactory
import javax.net.ssl.HostnameVerifier
import javax.net.ssl.SSLSocketFactory
import okhttp3.Address
import okhttp3.Call
import okhttp3.CertificatePinner
import okhttp3.Connection
import okhttp3.Dns
import okhttp3.HttpUrl
import okhttp3.Interceptor
import okhttp3.Request
import okhttp3.Response
Expand All @@ -33,7 +40,7 @@ import okhttp3.internal.connection.RealCall
* If the chain is for an application interceptor then [exchange] must be null. Otherwise it is for
* a network interceptor and [exchange] must be non-null.
*/
class RealInterceptorChain(
class RealInterceptorChain constructor(
internal val call: RealCall,
private val interceptors: List<Interceptor>,
private val index: Int,
Expand All @@ -42,6 +49,7 @@ class RealInterceptorChain(
internal val connectTimeoutMillis: Int,
internal val readTimeoutMillis: Int,
internal val writeTimeoutMillis: Int,
internal val clientOverrides: ClientOverrides?,
) : Interceptor.Chain {
private var calls: Int = 0

Expand All @@ -52,6 +60,7 @@ class RealInterceptorChain(
connectTimeoutMillis: Int = this.connectTimeoutMillis,
readTimeoutMillis: Int = this.readTimeoutMillis,
writeTimeoutMillis: Int = this.writeTimeoutMillis,
clientOverrides: ClientOverrides? = this.clientOverrides,
) = RealInterceptorChain(
call,
interceptors,
Expand All @@ -61,6 +70,7 @@ class RealInterceptorChain(
connectTimeoutMillis,
readTimeoutMillis,
writeTimeoutMillis,
clientOverrides,
)

override fun connection(): Connection? = exchange?.connection
Expand Down Expand Up @@ -98,6 +108,22 @@ class RealInterceptorChain(
return copy(writeTimeoutMillis = checkDuration("writeTimeout", timeout.toLong(), unit))
}

override fun withDns(dns: Dns?): Interceptor.Chain =
withClientOverrides {
copy(dns = dns)
}

override fun withSocketFactory(socketFactory: SocketFactory?): Interceptor.Chain =
withClientOverrides {
copy(socketFactory = socketFactory)
}

private fun withClientOverrides(overrides: ClientOverrides.() -> ClientOverrides): Interceptor.Chain {
check(exchange == null) { "ClientOverrides can't be adjusted in a network interceptor" }

return copy(clientOverrides = clientOverrides)
}

override fun call(): Call = call

override fun request(): Request = request
Expand Down Expand Up @@ -135,4 +161,39 @@ class RealInterceptorChain(

return response
}

/**
* Creates an [Address] of out of the provided [HttpUrl]
* that uses this client’s DNS, TLS, and proxy configuration.
*/
fun address(url: HttpUrl): Address {
var useSslSocketFactory: SSLSocketFactory? = null
var useHostnameVerifier: HostnameVerifier? = null
var useCertificatePinner: CertificatePinner? = null
if (url.isHttps) {
useSslSocketFactory = call.client.sslSocketFactory
useHostnameVerifier = call.client.hostnameVerifier
useCertificatePinner = call.client.certificatePinner
}

return Address(
uriHost = url.host,
uriPort = url.port,
dns = clientOverrides?.dns ?: call.client.dns,
socketFactory = clientOverrides?.socketFactory ?: call.client.socketFactory,
sslSocketFactory = useSslSocketFactory,
hostnameVerifier = useHostnameVerifier,
certificatePinner = useCertificatePinner,
proxyAuthenticator = call.client.proxyAuthenticator,
proxy = call.client.proxy,
protocols = call.client.protocols,
connectionSpecs = call.client.connectionSpecs,
proxySelector = call.client.proxySelector,
)
}

data class ClientOverrides(
val dns: Dns? = null,
val socketFactory: SocketFactory? = null,
)
}
4 changes: 4 additions & 0 deletions okhttp/src/jvmTest/kotlin/okhttp3/KotlinSourceModernTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -1344,5 +1344,9 @@ class KotlinSourceModernTest {
timeout: Int,
unit: TimeUnit,
): Interceptor.Chain = TODO()

override fun withDns(dns: Dns?): Interceptor.Chain = TODO()

override fun withSocketFactory(socketFactory: SocketFactory?): Interceptor.Chain = TODO()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -567,6 +567,7 @@ class RouteSelectorTest {
connectTimeoutMillis = 10_000,
readTimeoutMillis = 10_000,
writeTimeoutMillis = 10_000,
clientOverrides = null,
)

companion object {
Expand Down
Loading