diff --git a/okhttp/src/main/java/okhttp3/OkHttpClient.kt b/okhttp/src/main/java/okhttp3/OkHttpClient.kt index ffc23c8013ab..b7056985b11a 100644 --- a/okhttp/src/main/java/okhttp3/OkHttpClient.kt +++ b/okhttp/src/main/java/okhttp3/OkHttpClient.kt @@ -163,9 +163,9 @@ open class OkHttpClient internal constructor( @get:JvmName("proxySelector") val proxySelector: ProxySelector = when { - // Avoid possible SecurityException from ProxySelector.getDefault - builder.proxy != null -> NullProxySelector() - else -> builder.proxySelector ?: ProxySelector.getDefault() ?: NullProxySelector() + // Defer calls to ProxySelector.getDefault() because it can throw a SecurityException. + builder.proxy != null -> NullProxySelector + else -> builder.proxySelector ?: ProxySelector.getDefault() ?: NullProxySelector } @get:JvmName("proxyAuthenticator") val proxyAuthenticator: Authenticator = diff --git a/okhttp/src/main/java/okhttp3/internal/proxy/NullProxySelector.kt b/okhttp/src/main/java/okhttp3/internal/proxy/NullProxySelector.kt index d18d2eca3100..40c0674146f1 100644 --- a/okhttp/src/main/java/okhttp3/internal/proxy/NullProxySelector.kt +++ b/okhttp/src/main/java/okhttp3/internal/proxy/NullProxySelector.kt @@ -24,7 +24,7 @@ import java.net.URI /** * A proxy selector that always returns the [Proxy.NO_PROXY]. */ -open class NullProxySelector : ProxySelector() { +object NullProxySelector : ProxySelector() { override fun select(uri: URI?): List { requireNotNull(uri) { "uri must not be null" } return listOf(Proxy.NO_PROXY) diff --git a/okhttp/src/test/java/okhttp3/CallTest.java b/okhttp/src/test/java/okhttp3/CallTest.java index 2a50b527b6b7..fb5ce4c0e20a 100644 --- a/okhttp/src/test/java/okhttp3/CallTest.java +++ b/okhttp/src/test/java/okhttp3/CallTest.java @@ -786,6 +786,36 @@ private void postBodyRetransmittedAfterAuthorizationFail(String body) throws Exc assertThat(server.takeRequest().getSequenceNumber()).isEqualTo(2); } + /** + * + * @throws Exception + */ + @Test public void connectionPoolingWithFreshClientSamePool() throws Exception { + server.enqueue(new MockResponse().setBody("abc")); + server.enqueue(new MockResponse().setBody("def")); + server.enqueue(new MockResponse().setBody("ghi")); + + client = new OkHttpClient.Builder() + .connectionPool(client.connectionPool()) + .proxy(server.toProxyAddress()) + .build(); + executeSynchronously("/a").assertBody("abc"); + client = new OkHttpClient.Builder() + .connectionPool(client.connectionPool()) + .proxy(server.toProxyAddress()) + .build(); + executeSynchronously("/b").assertBody("def"); + client = new OkHttpClient.Builder() + .connectionPool(client.connectionPool()) + .proxy(server.toProxyAddress()) + .build(); + executeSynchronously("/c").assertBody("ghi"); + + assertThat(server.takeRequest().getSequenceNumber()).isEqualTo(0); + assertThat(server.takeRequest().getSequenceNumber()).isEqualTo(1); + assertThat(server.takeRequest().getSequenceNumber()).isEqualTo(2); + } + @Test public void connectionPooling_Async() throws Exception { server.enqueue(new MockResponse().setBody("abc")); server.enqueue(new MockResponse().setBody("def"));