diff --git a/core/src/main/java/io/grpc/internal/ProxyDetectorImpl.java b/core/src/main/java/io/grpc/internal/ProxyDetectorImpl.java index fe38d8ad0c..48172ebc3d 100644 --- a/core/src/main/java/io/grpc/internal/ProxyDetectorImpl.java +++ b/core/src/main/java/io/grpc/internal/ProxyDetectorImpl.java @@ -184,7 +184,8 @@ class ProxyDetectorImpl implements ProxyDetector { + "be removed in a future release. Use the JVM flags " + "\"-Dhttps.proxyHost=HOST -Dhttps.proxyPort=PORT\" to set the https proxy for " + "this JVM."); - return new InetSocketAddress(parts[0], port); + // Return an unresolved InetSocketAddress to avoid DNS lookup + return InetSocketAddress.createUnresolved(parts[0], port); } /** diff --git a/okhttp/src/main/java/io/grpc/okhttp/OkHttpClientTransport.java b/okhttp/src/main/java/io/grpc/okhttp/OkHttpClientTransport.java index f9b62d9b24..6e504d0a9f 100644 --- a/okhttp/src/main/java/io/grpc/okhttp/OkHttpClientTransport.java +++ b/okhttp/src/main/java/io/grpc/okhttp/OkHttpClientTransport.java @@ -472,7 +472,13 @@ class OkHttpClientTransport implements ConnectionClientTransport { private Socket createHttpProxySocket(InetSocketAddress address, InetSocketAddress proxyAddress, String proxyUsername, String proxyPassword) throws IOException, StatusException { try { - Socket sock = new Socket(proxyAddress.getAddress(), proxyAddress.getPort()); + Socket sock; + // The proxy address may not be resolved + if (proxyAddress.getAddress() != null) { + sock = new Socket(proxyAddress.getAddress(), proxyAddress.getPort()); + } else { + sock = new Socket(proxyAddress.getHostName(), proxyAddress.getPort()); + } sock.setTcpNoDelay(true); Source source = Okio.source(sock); diff --git a/okhttp/src/test/java/io/grpc/okhttp/OkHttpClientTransportTest.java b/okhttp/src/test/java/io/grpc/okhttp/OkHttpClientTransportTest.java index 6a0b9b9479..5bc0ed5d37 100644 --- a/okhttp/src/test/java/io/grpc/okhttp/OkHttpClientTransportTest.java +++ b/okhttp/src/test/java/io/grpc/okhttp/OkHttpClientTransportTest.java @@ -1569,6 +1569,33 @@ public class OkHttpClientTransportTest { verify(transportListener, timeout(TIME_OUT_MS)).transportTerminated(); } + @Test + public void proxy_unresolvedProxyAddress() throws Exception { + clientTransport = new OkHttpClientTransport( + InetSocketAddress.createUnresolved("theservice", 80), + "authority", + "userAgent", + executor, + null, + null, + ConnectionSpec.CLEARTEXT, + DEFAULT_MAX_MESSAGE_SIZE, + InetSocketAddress.createUnresolved("unresolvedproxy", 80), + null, + null, + tooManyPingsRunnable); + clientTransport.start(transportListener); + + ArgumentCaptor captor = ArgumentCaptor.forClass(Status.class); + verify(transportListener, timeout(TIME_OUT_MS)).transportShutdown(captor.capture()); + Status error = captor.getValue(); + assertTrue("Status didn't contain proxy: " + captor.getValue(), + error.getDescription().contains("proxy")); + assertEquals("Not UNAVAILABLE: " + captor.getValue(), + Status.UNAVAILABLE.getCode(), error.getCode()); + verify(transportListener, timeout(TIME_OUT_MS)).transportTerminated(); + } + @Test public void goAway_notUtf8() throws Exception { initTransport();