diff --git a/okhttp/src/commonJvmAndroid/kotlin/okhttp3/internal/connection/RouteSelector.kt b/okhttp/src/commonJvmAndroid/kotlin/okhttp3/internal/connection/RouteSelector.kt index 10622d9e6260..04493b4cbc8a 100644 --- a/okhttp/src/commonJvmAndroid/kotlin/okhttp3/internal/connection/RouteSelector.kt +++ b/okhttp/src/commonJvmAndroid/kotlin/okhttp3/internal/connection/RouteSelector.kt @@ -221,7 +221,14 @@ class RouteSelector internal constructor( else -> socketPort } - val dnsRequest = Dns.Request(socketHost, dnsPort) + val dnsRequest = + try { + Dns.Request(socketHost, dnsPort) + } catch (e: IllegalArgumentException) { + throw UnknownHostException("invalid host $socketHost.").apply { + initCause(e) + } + } val result = when (val dnsCall = address.dns.newCall(dnsRequest)) { is LookupDnsCall -> { diff --git a/okhttp/src/jvmTest/kotlin/okhttp3/CallTest.kt b/okhttp/src/jvmTest/kotlin/okhttp3/CallTest.kt index e00c97a4e8e1..b2bb2351dfd6 100644 --- a/okhttp/src/jvmTest/kotlin/okhttp3/CallTest.kt +++ b/okhttp/src/jvmTest/kotlin/okhttp3/CallTest.kt @@ -45,6 +45,7 @@ import java.net.CookiePolicy import java.net.HttpCookie import java.net.HttpURLConnection import java.net.InetAddress +import java.net.InetSocketAddress import java.net.ProtocolException import java.net.Proxy import java.net.SocketTimeoutException @@ -1072,6 +1073,21 @@ open class CallTest { } } + /** https://github.com/lysine-dev/okhttp/issues/9758 */ + @Test + fun malformedProxyHostnameFailsGracefully() { + val proxySelector = RecordingProxySelector() + proxySelector.proxies.add( + Proxy( + Proxy.Type.HTTP, + InetSocketAddress.createUnresolved("internet ", 8080), + ), + ) + client = client.newBuilder().proxySelector(proxySelector).build() + executeSynchronously(server.url("/").toString()) + .assertFailure(UnknownHostException::class.java) + } + /** https://github.com/lysine-dev/okhttp/issues/4875 */ @Test fun interceptorRecoversWhenRoutesExhausted() { diff --git a/okhttp/src/jvmTest/kotlin/okhttp3/internal/connection/RouteSelectorTest.kt b/okhttp/src/jvmTest/kotlin/okhttp3/internal/connection/RouteSelectorTest.kt index 38c4e52b30c5..b3357cac1c8b 100644 --- a/okhttp/src/jvmTest/kotlin/okhttp3/internal/connection/RouteSelectorTest.kt +++ b/okhttp/src/jvmTest/kotlin/okhttp3/internal/connection/RouteSelectorTest.kt @@ -50,6 +50,7 @@ import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.Assumptions.assumeTrue import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertThrows import org.junit.jupiter.api.extension.RegisterExtension @Burst @@ -479,6 +480,20 @@ class RouteSelectorTest( assertThat(routeSelector.hasNext()).isFalse() } + @Test fun failedRouteWithInvalidProxy() { + val address = + factory.newAddress( + proxy = + Proxy( + Proxy.Type.HTTP, + InetSocketAddress.createUnresolved("a b", 8080), + ), + ) + val routeSelector = newRouteSelector(address) + + assertThrows { routeSelector.next() } + } + @Test fun queryForAllSelectedRoutes() { val address = factory.newAddress() val routeSelector = newRouteSelector(address)