Merge "Remove workaround for *.clients.google.com." into lmp-dev
diff --git a/okhttp-tests/src/test/java/com/squareup/okhttp/internal/http/RouteSelectorTest.java b/okhttp-tests/src/test/java/com/squareup/okhttp/internal/http/RouteSelectorTest.java
index ebfb282..c8e2647 100644
--- a/okhttp-tests/src/test/java/com/squareup/okhttp/internal/http/RouteSelectorTest.java
+++ b/okhttp-tests/src/test/java/com/squareup/okhttp/internal/http/RouteSelectorTest.java
@@ -18,10 +18,10 @@
 import com.squareup.okhttp.Address;
 import com.squareup.okhttp.Connection;
 import com.squareup.okhttp.ConnectionPool;
+import com.squareup.okhttp.HostResolver;
 import com.squareup.okhttp.OkAuthenticator;
 import com.squareup.okhttp.Protocol;
 import com.squareup.okhttp.RouteDatabase;
-import com.squareup.okhttp.internal.Dns;
 import com.squareup.okhttp.internal.SslContextBuilder;
 import java.io.IOException;
 import java.net.InetAddress;
@@ -423,7 +423,7 @@
     }
   }
 
-  private static class FakeDns implements Dns {
+  private static class FakeDns implements HostResolver {
     List<String> requestedHosts = new ArrayList<String>();
     InetAddress[] inetAddresses;
 
diff --git a/okhttp/src/main/java/com/squareup/okhttp/internal/Dns.java b/okhttp/src/main/java/com/squareup/okhttp/HostResolver.java
similarity index 90%
rename from okhttp/src/main/java/com/squareup/okhttp/internal/Dns.java
rename to okhttp/src/main/java/com/squareup/okhttp/HostResolver.java
index a89b293..c7a1edb 100644
--- a/okhttp/src/main/java/com/squareup/okhttp/internal/Dns.java
+++ b/okhttp/src/main/java/com/squareup/okhttp/HostResolver.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.squareup.okhttp.internal;
+package com.squareup.okhttp;
 
 import java.net.InetAddress;
 import java.net.UnknownHostException;
@@ -22,8 +22,8 @@
  * Domain name service. Prefer this over {@link InetAddress#getAllByName} to
  * make code more testable.
  */
-public interface Dns {
-  Dns DEFAULT = new Dns() {
+public interface HostResolver {
+  HostResolver DEFAULT = new HostResolver() {
     @Override public InetAddress[] getAllByName(String host) throws UnknownHostException {
       if (host == null) throw new UnknownHostException("host == null");
       return InetAddress.getAllByName(host);
diff --git a/okhttp/src/main/java/com/squareup/okhttp/OkHttpClient.java b/okhttp/src/main/java/com/squareup/okhttp/OkHttpClient.java
index 882c13d..0bb98c5 100644
--- a/okhttp/src/main/java/com/squareup/okhttp/OkHttpClient.java
+++ b/okhttp/src/main/java/com/squareup/okhttp/OkHttpClient.java
@@ -66,6 +66,7 @@
   private HostnameVerifier hostnameVerifier;
   private OkAuthenticator authenticator;
   private ConnectionPool connectionPool;
+  private HostResolver hostResolver;
   private boolean followProtocolRedirects = true;
   private int connectTimeout;
   private int readTimeout;
@@ -382,6 +383,19 @@
     return protocols;
   }
 
+  /*
+   * Sets the {@code HostResolver} that will be used by this client to resolve
+   * hostnames to IP addresses.
+   */
+  public OkHttpClient setHostResolver(HostResolver hostResolver) {
+    this.hostResolver = hostResolver;
+    return this;
+  }
+
+  public HostResolver getHostResolver() {
+    return hostResolver;
+  }
+
   /**
    * Invokes {@code request} immediately, and blocks until the response can be
    * processed or is in error.
@@ -491,6 +505,9 @@
     if (result.protocols == null) {
       result.protocols = Protocol.HTTP2_SPDY3_AND_HTTP;
     }
+    if (result.hostResolver == null) {
+      result.hostResolver = HostResolver.DEFAULT;
+    }
     return result;
   }
 
diff --git a/okhttp/src/main/java/com/squareup/okhttp/internal/http/HttpEngine.java b/okhttp/src/main/java/com/squareup/okhttp/internal/http/HttpEngine.java
index 554bc6e..38e26c3 100644
--- a/okhttp/src/main/java/com/squareup/okhttp/internal/http/HttpEngine.java
+++ b/okhttp/src/main/java/com/squareup/okhttp/internal/http/HttpEngine.java
@@ -20,6 +20,7 @@
 import com.squareup.okhttp.Address;
 import com.squareup.okhttp.Connection;
 import com.squareup.okhttp.Headers;
+import com.squareup.okhttp.HostResolver;
 import com.squareup.okhttp.OkHttpClient;
 import com.squareup.okhttp.OkResponseCache;
 import com.squareup.okhttp.Request;
@@ -27,7 +28,6 @@
 import com.squareup.okhttp.ResponseSource;
 import com.squareup.okhttp.Route;
 import com.squareup.okhttp.TunnelRequest;
-import com.squareup.okhttp.internal.Dns;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.CacheRequest;
@@ -240,7 +240,7 @@
           client.getSocketFactory(), sslSocketFactory, hostnameVerifier, client.getAuthenticator(),
           client.getProxy(), client.getProtocols());
       routeSelector = new RouteSelector(address, request.uri(), client.getProxySelector(),
-          client.getConnectionPool(), Dns.DEFAULT, client.getRoutesDatabase());
+          client.getConnectionPool(), client.getHostResolver(), client.getRoutesDatabase());
     }
 
     connection = routeSelector.next(request.method());
diff --git a/okhttp/src/main/java/com/squareup/okhttp/internal/http/RouteSelector.java b/okhttp/src/main/java/com/squareup/okhttp/internal/http/RouteSelector.java
index f935d5c..c634bab 100644
--- a/okhttp/src/main/java/com/squareup/okhttp/internal/http/RouteSelector.java
+++ b/okhttp/src/main/java/com/squareup/okhttp/internal/http/RouteSelector.java
@@ -18,9 +18,9 @@
 import com.squareup.okhttp.Address;
 import com.squareup.okhttp.Connection;
 import com.squareup.okhttp.ConnectionPool;
+import com.squareup.okhttp.HostResolver;
 import com.squareup.okhttp.Route;
 import com.squareup.okhttp.RouteDatabase;
-import com.squareup.okhttp.internal.Dns;
 import java.io.IOException;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
@@ -55,7 +55,7 @@
   private final URI uri;
   private final ProxySelector proxySelector;
   private final ConnectionPool pool;
-  private final Dns dns;
+  private final HostResolver hostResolver;
   private final RouteDatabase routeDatabase;
 
   /* The most recently attempted route. */
@@ -79,12 +79,12 @@
   private final List<Route> postponedRoutes;
 
   public RouteSelector(Address address, URI uri, ProxySelector proxySelector, ConnectionPool pool,
-      Dns dns, RouteDatabase routeDatabase) {
+      HostResolver hostResolver, RouteDatabase routeDatabase) {
     this.address = address;
     this.uri = uri;
     this.proxySelector = proxySelector;
     this.pool = pool;
-    this.dns = dns;
+    this.hostResolver = hostResolver;
     this.routeDatabase = routeDatabase;
     this.postponedRoutes = new LinkedList<Route>();
 
@@ -229,7 +229,7 @@
     }
 
     // Try each address for best behavior in mixed IPv4/IPv6 environments.
-    socketAddresses = dns.getAllByName(socketHost);
+    socketAddresses = hostResolver.getAllByName(socketHost);
     nextSocketAddressIndex = 0;
   }