From 3777b8bf6575a6ddd19045985942a2528b8552ad Mon Sep 17 00:00:00 2001 From: Xiao Hang Date: Mon, 29 Jun 2015 14:14:20 -0700 Subject: [PATCH] Use hostname instead of InetAddress for Socket creation. On Android platform, the constructor using hostname will iterate through all solved ip address for making connection. Before we implement happy eyeballs, this could be a workaround for Android users. --- .../okhttp/OkHttpChannelBuilder.java | 19 ++++++++------- .../okhttp/OkHttpClientTransport.java | 24 +++++++++---------- .../okhttp/OkHttpClientTransportFactory.java | 11 +++++---- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/okhttp/src/main/java/io/grpc/transport/okhttp/OkHttpChannelBuilder.java b/okhttp/src/main/java/io/grpc/transport/okhttp/OkHttpChannelBuilder.java index 12ccab5fd8..234f5cbd9e 100644 --- a/okhttp/src/main/java/io/grpc/transport/okhttp/OkHttpChannelBuilder.java +++ b/okhttp/src/main/java/io/grpc/transport/okhttp/OkHttpChannelBuilder.java @@ -43,7 +43,6 @@ import io.grpc.SharedResourceHolder; import io.grpc.SharedResourceHolder.Resource; import io.grpc.transport.ClientTransportFactory; -import java.net.InetSocketAddress; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -84,18 +83,20 @@ public final class OkHttpChannelBuilder extends AbstractChannelBuilderShould only used by tests. */ public OkHttpChannelBuilder overrideHostForAuthority(String host) { - this.host = host; + this.authorityHost = host; return this; } @@ -144,7 +145,7 @@ public final class OkHttpChannelBuilder extends AbstractChannelBuilder pendingStreams = new LinkedList(); private final ConnectionSpec connectionSpec; - OkHttpClientTransport(InetSocketAddress address, String authorityHost, Executor executor, + OkHttpClientTransport(String host, int port, String authorityHost, Executor executor, @Nullable SSLSocketFactory sslSocketFactory, ConnectionSpec connectionSpec) { - this.address = Preconditions.checkNotNull(address); + this.host = Preconditions.checkNotNull(host); + this.port = port; this.authorityHost = authorityHost; - defaultAuthority = authorityHost + ":" + address.getPort(); + defaultAuthority = authorityHost + ":" + port; this.executor = Preconditions.checkNotNull(executor); // Client initiated streams are odd, server initiated ones are even. Server should not need to // use it. We start clients at 3 to avoid conflicting with HTTP negotiation. @@ -191,7 +192,8 @@ class OkHttpClientTransport implements ClientTransport { @VisibleForTesting OkHttpClientTransport(Executor executor, FrameReader frameReader, AsyncFrameWriter frameWriter, int nextStreamId, Socket socket, Ticker ticker) { - address = null; + host = null; + port = 0; authorityHost = null; defaultAuthority = "notarealauthority:80"; this.executor = Preconditions.checkNotNull(executor); @@ -318,18 +320,14 @@ class OkHttpClientTransport implements ClientTransport { public void start(Listener listener) { this.listener = Preconditions.checkNotNull(listener, "listener"); // We set host to null for test. - if (address != null) { + if (host != null) { BufferedSource source; BufferedSink sink; try { - if (address.isUnresolved()) { - socket = new Socket(address.getHostName(), address.getPort()); - } else { - socket = new Socket(address.getAddress(), address.getPort()); - } + socket = new Socket(host, port); if (sslSocketFactory != null) { socket = OkHttpTlsUpgrader.upgrade( - sslSocketFactory, socket, authorityHost, address.getPort(), connectionSpec); + sslSocketFactory, socket, authorityHost, port, connectionSpec); } socket.setTcpNoDelay(true); source = Okio.buffer(Okio.source(socket)); diff --git a/okhttp/src/main/java/io/grpc/transport/okhttp/OkHttpClientTransportFactory.java b/okhttp/src/main/java/io/grpc/transport/okhttp/OkHttpClientTransportFactory.java index 3bf1201fa5..c0305039e3 100644 --- a/okhttp/src/main/java/io/grpc/transport/okhttp/OkHttpClientTransportFactory.java +++ b/okhttp/src/main/java/io/grpc/transport/okhttp/OkHttpClientTransportFactory.java @@ -38,7 +38,6 @@ import com.squareup.okhttp.ConnectionSpec; import io.grpc.transport.ClientTransport; import io.grpc.transport.ClientTransportFactory; -import java.net.InetSocketAddress; import java.util.concurrent.ExecutorService; import javax.net.ssl.SSLSocketFactory; @@ -47,15 +46,17 @@ import javax.net.ssl.SSLSocketFactory; * Factory that manufactures instances of {@link OkHttpClientTransport}. */ class OkHttpClientTransportFactory implements ClientTransportFactory { - private final InetSocketAddress address; + private final String host; + private final int port; private final ExecutorService executor; private final String authorityHost; private final SSLSocketFactory sslSocketFactory; private final ConnectionSpec connectionSpec; - public OkHttpClientTransportFactory(InetSocketAddress address, String authorityHost, + public OkHttpClientTransportFactory(String host, int port, String authorityHost, ExecutorService executor, SSLSocketFactory factory, ConnectionSpec connectionSpec) { - this.address = Preconditions.checkNotNull(address, "address"); + this.host = Preconditions.checkNotNull(host, "host"); + this.port = port; this.executor = Preconditions.checkNotNull(executor, "executor"); this.authorityHost = Preconditions.checkNotNull(authorityHost, "authorityHost"); this.sslSocketFactory = factory; @@ -65,7 +66,7 @@ class OkHttpClientTransportFactory implements ClientTransportFactory { @Override public ClientTransport newClientTransport() { return new OkHttpClientTransport( - address, authorityHost, executor, sslSocketFactory, connectionSpec); + host, port, authorityHost, executor, sslSocketFactory, connectionSpec); } }