1
0
mirror of https://github.com/square/okhttp.git synced 2026-01-27 04:22:07 +03:00

Prepare to promote HttpConnection + Pool to public API.

Giving the application code access to the connection pool
is tricky: it exposes more implementation details from
OkHttp; details that are quite inaccessible through the
conventional HttpURLConnection APIs. Currently the only
thing regular users get are a pair of awkward system
properties.

But exposing these should also be useful: it'll allow the
application to observe the pool (for performance monitoring)
and possibly also to directly manage it (by setting policy,
or to evict when the application is paused).
This commit is contained in:
jwilson
2012-12-22 18:05:27 -05:00
parent 6579f9d974
commit 70e64037ff
7 changed files with 129 additions and 95 deletions

View File

@@ -18,11 +18,11 @@
package com.squareup.okhttp.internal.net.http;
import com.squareup.okhttp.internal.Platform;
import com.squareup.okhttp.internal.io.IoUtils;
import com.squareup.okhttp.internal.net.spdy.SpdyConnection;
import com.squareup.okhttp.internal.util.Libcore;
import com.squareup.okhttp.internal.util.Objects;
import java.io.BufferedInputStream;
import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -46,9 +46,23 @@ import javax.net.ssl.SSLSocketFactory;
* the {@link Address} inner class.
*
* <p>Do not confuse this class with the misnamed {@code HttpURLConnection},
* which isn't so much a connection as a single request/response pair.
* which isn't so much a connection as a single request/response exchange.
*
* <h3>Modern TLS</h3>
* There are tradeoffs when selecting which options to include when negotiating
* a secure connection to a remote host. Newer TLS options are quite useful:
* <ul>
* <li>Server Name Indication (SNI) enables one IP address to negotiate secure
* connections for multiple domain names.
* <li>Next Protocol Negotiation (NPN) enables the HTTPS port (443) to be used
* for both HTTP and SPDY transports.
* </ul>
* Unfortunately, older HTTPS servers refuse to connect when such options are
* presented. Rather than avoiding these options entirely, this class allows a
* connection to be attempted with modern options and then retried without them
* should the attempt fail.
*/
final class HttpConnection {
public final class HttpConnection implements Closeable {
private static final byte[] NPN_PROTOCOLS = new byte[] {
6, 's', 'p', 'd', 'y', '/', '2',
8, 'h', 't', 't', 'p', '/', '1', '.', '1',
@@ -60,46 +74,27 @@ final class HttpConnection {
'h', 't', 't', 'p', '/', '1', '.', '1',
};
/** First try a TLS connection with various extensions enabled. */
public static final int TLS_MODE_AGGRESSIVE = 1;
/**
* If that TLS connection fails (and its not unheard of that it will)
* fall back to a basic SSLv3 connection.
*/
public static final int TLS_MODE_COMPATIBLE = 0;
/**
* Unknown TLS mode.
*/
public static final int TLS_MODE_NULL = -1;
final Address address;
final Proxy proxy;
final InetSocketAddress inetSocketAddress;
final int tlsMode;
private final Address address;
private final Proxy proxy;
private final InetSocketAddress inetSocketAddress;
private final boolean modernTls;
private Socket socket;
private InputStream in;
private OutputStream out;
private boolean recycled = false;
private SpdyConnection spdyConnection;
private int httpMinorVersion = 1; // Assume HTTP/1.1
/**
* The version this client will use. Either 0 for HTTP/1.0, or 1 for
* HTTP/1.1. Upon receiving a non-HTTP/1.1 response, this client
* automatically sets its version to HTTP/1.0.
*/
int httpMinorVersion = 1; // Assume HTTP/1.1
HttpConnection(Address address, Proxy proxy, InetSocketAddress inetSocketAddress, int tlsMode) {
public HttpConnection(Address address, Proxy proxy, InetSocketAddress inetSocketAddress,
boolean modernTls) {
if (address == null || proxy == null || inetSocketAddress == null) {
throw new IllegalArgumentException();
}
this.address = address;
this.proxy = proxy;
this.inetSocketAddress = inetSocketAddress;
this.tlsMode = tlsMode;
this.modernTls = modernTls;
}
public void connect(int connectTimeout, int readTimeout, TunnelConfig tunnelConfig)
@@ -143,9 +138,9 @@ final class HttpConnection {
socket = address.sslSocketFactory.createSocket(
socket, address.uriHost, address.uriPort, true /* autoClose */);
SSLSocket sslSocket = (SSLSocket) socket;
platform.makeTlsTolerant(sslSocket, address.uriHost, tlsMode == TLS_MODE_AGGRESSIVE);
platform.makeTlsTolerant(sslSocket, address.uriHost, modernTls);
if (tlsMode == TLS_MODE_AGGRESSIVE) {
if (modernTls) {
platform.setNpnProtocols(sslSocket, NPN_PROTOCOLS);
}
@@ -161,7 +156,7 @@ final class HttpConnection {
in = sslSocket.getInputStream();
byte[] selectedProtocol;
if (tlsMode == TLS_MODE_AGGRESSIVE
if (modernTls
&& (selectedProtocol = platform.getNpnSelectedProtocol(sslSocket)) != null) {
if (Arrays.equals(selectedProtocol, SPDY2)) {
spdyConnection = new SpdyConnection.Builder(true, in, out).build();
@@ -173,10 +168,8 @@ final class HttpConnection {
}
}
public void closeSocketAndStreams() {
IoUtils.closeQuietly(out);
IoUtils.closeQuietly(in);
IoUtils.closeQuietly(socket);
@Override public void close() throws IOException {
socket.close();
}
/**
@@ -196,6 +189,18 @@ final class HttpConnection {
return address;
}
public InetSocketAddress getSocketAddress() {
return inetSocketAddress;
}
public boolean isModernTls() {
return modernTls;
}
/**
* Returns the socket that this connection uses, or null if the connection
* is not currently connected.
*/
public Socket getSocket() {
return socket;
}
@@ -225,7 +230,7 @@ final class HttpConnection {
/**
* Returns the transport appropriate for this connection.
*/
public Transport newTransport(HttpEngine httpEngine) throws IOException {
public Object newTransport(HttpEngine httpEngine) throws IOException {
if (spdyConnection != null) {
return new SpdyTransport(httpEngine, spdyConnection);
} else {
@@ -241,6 +246,19 @@ final class HttpConnection {
return spdyConnection != null;
}
/**
* Returns the minor HTTP version that should be used for future requests on
* this connection. Either 0 for HTTP/1.0, or 1 for HTTP/1.1. The default
* value is 1 for new connections.
*/
public int getHttpMinorVersion() {
return httpMinorVersion;
}
public void setHttpMinorVersion(int httpMinorVersion) {
this.httpMinorVersion = httpMinorVersion;
}
public static final class TunnelConfig {
private final URL url;
private final String host;

View File

@@ -17,6 +17,7 @@
package com.squareup.okhttp.internal.net.http;
import com.squareup.okhttp.internal.io.IoUtils;
import com.squareup.okhttp.internal.util.Libcore;
import java.net.SocketException;
import java.util.ArrayList;
@@ -72,8 +73,11 @@ final class HttpConnectionPool {
}
if (connection.isEligibleForRecycling()) {
// Since Socket is recycled, re-tag before using
// TODO: don't tag SPDY connections
Libcore.tagSocket(connection.getSocket());
return connection;
} else {
// TODO: is the connection leaked here?
}
}
}
@@ -94,7 +98,7 @@ final class HttpConnectionPool {
} catch (SocketException e) {
// When unable to remove tagging, skip recycling and close
Libcore.logW("Unable to untagSocket(): " + e);
connection.closeSocketAndStreams();
IoUtils.closeQuietly(connection);
return;
}
@@ -115,7 +119,7 @@ final class HttpConnectionPool {
}
// don't close streams while holding a lock!
connection.closeSocketAndStreams();
IoUtils.closeQuietly(connection);
}
/**

View File

@@ -261,7 +261,7 @@ public class HttpEngine {
throw new IllegalStateException();
}
transport = connection.newTransport(this);
transport = (Transport) connection.newTransport(this);
if (hasRequestBody() && requestBodyOut == null) {
// Create a request body if we don't have one already. We'll already
@@ -429,7 +429,7 @@ public class HttpEngine {
connectionReleased = true;
if (!reusable || !transport.makeReusable(requestBodyOut, responseTransferIn)) {
connection.closeSocketAndStreams();
IoUtils.closeQuietly(connection);
connection = null;
} else if (automaticallyReleaseConnectionToPool) {
HttpConnectionPool.INSTANCE.recycle(connection);
@@ -500,7 +500,7 @@ public class HttpEngine {
}
// TODO: this shouldn't be set for SPDY (it's ignored)
if ((connection == null || connection.httpMinorVersion != 0)
if ((connection == null || connection.getHttpMinorVersion() != 0)
&& requestHeaders.getConnection() == null) {
requestHeaders.setConnection("Keep-Alive");
}
@@ -533,7 +533,7 @@ public class HttpEngine {
* it needs to be set even if the transport is SPDY.
*/
String getRequestLine() {
String protocol = (connection == null || connection.httpMinorVersion != 0)
String protocol = (connection == null || connection.getHttpMinorVersion() != 0)
? "HTTP/1.1"
: "HTTP/1.0";
return method + " " + requestString() + " " + protocol;

View File

@@ -68,7 +68,7 @@ final class HttpTransport implements Transport {
boolean chunked = httpEngine.requestHeaders.isChunked();
if (!chunked
&& httpEngine.policy.getChunkLength() > 0
&& httpEngine.connection.httpMinorVersion != 0) {
&& httpEngine.connection.getHttpMinorVersion() != 0) {
httpEngine.requestHeaders.setChunked();
chunked = true;
}
@@ -144,7 +144,7 @@ final class HttpTransport implements Transport {
@Override public ResponseHeaders readResponseHeaders() throws IOException {
RawHeaders headers = RawHeaders.fromBytes(socketIn);
httpEngine.connection.httpMinorVersion = headers.getHttpMinorVersion();
httpEngine.connection.setHttpMinorVersion(headers.getHttpMinorVersion());
receiveHeaders(headers);
return new ResponseHeaders(httpEngine.uri, headers);
}

View File

@@ -16,9 +16,6 @@
package com.squareup.okhttp.internal.net.http;
import com.squareup.okhttp.internal.net.Dns;
import static com.squareup.okhttp.internal.net.http.HttpConnection.TLS_MODE_AGGRESSIVE;
import static com.squareup.okhttp.internal.net.http.HttpConnection.TLS_MODE_COMPATIBLE;
import static com.squareup.okhttp.internal.net.http.HttpConnection.TLS_MODE_NULL;
import com.squareup.okhttp.internal.util.Libcore;
import java.io.IOException;
import java.net.InetAddress;
@@ -38,6 +35,23 @@ import java.util.NoSuchElementException;
* recycled.
*/
public final class RouteSelector {
/**
* A TLS connection with useful extensions enabled. This mode supports more
* features, but is less likely to be compatible with older HTTP servers.
*/
private static final int TLS_MODE_MODERN = 1;
/**
* A fallback connection with only basic functionality. Currently this uses
* SSL 3.0.
*/
private static final int TLS_MODE_COMPATIBLE = 0;
/**
* Unknown TLS mode.
*/
private static final int TLS_MODE_NULL = -1;
private final HttpConnection.Address address;
private final URI uri;
private final ProxySelector proxySelector;
@@ -102,9 +116,9 @@ public final class RouteSelector {
lastInetSocketAddress = nextInetSocketAddress();
resetNextTlsMode();
}
int tlsMode = nextTlsMode();
boolean modernTls = nextTlsMode() == TLS_MODE_MODERN;
return new HttpConnection(address, lastProxy, lastInetSocketAddress, tlsMode);
return new HttpConnection(address, lastProxy, lastInetSocketAddress, modernTls);
}
/**
@@ -112,9 +126,9 @@ public final class RouteSelector {
* failure on a connection returned by this route selector.
*/
public void connectFailed(HttpConnection connection, IOException failure) {
if (connection.proxy.type() != Proxy.Type.DIRECT && proxySelector != null) {
if (connection.getProxy().type() != Proxy.Type.DIRECT && proxySelector != null) {
// Tell the proxy selector when we fail to connect on a fresh connection.
proxySelector.connectFailed(uri, connection.proxy.address(), failure);
proxySelector.connectFailed(uri, connection.getProxy().address(), failure);
}
}
@@ -203,7 +217,7 @@ public final class RouteSelector {
/** Resets {@link #nextTlsMode} to the first option. */
private void resetNextTlsMode() {
nextTlsMode = (address.sslSocketFactory != null)
? TLS_MODE_AGGRESSIVE
? TLS_MODE_MODERN
: TLS_MODE_COMPATIBLE;
}
@@ -214,9 +228,9 @@ public final class RouteSelector {
/** Returns the next TLS mode to try. */
private int nextTlsMode() {
if (nextTlsMode == TLS_MODE_AGGRESSIVE) {
if (nextTlsMode == TLS_MODE_MODERN) {
nextTlsMode = TLS_MODE_COMPATIBLE;
return TLS_MODE_AGGRESSIVE;
return TLS_MODE_MODERN;
} else if (nextTlsMode == TLS_MODE_COMPATIBLE) {
nextTlsMode = TLS_MODE_NULL; // So that hasNextTlsMode() returns false.
return TLS_MODE_COMPATIBLE;

View File

@@ -49,7 +49,7 @@ final class SpdyTransport implements Transport {
return;
}
RawHeaders requestHeaders = httpEngine.requestHeaders.getHeaders();
String version = httpEngine.connection.httpMinorVersion == 1 ? "HTTP/1.1" : "HTTP/1.0";
String version = httpEngine.connection.getHttpMinorVersion() == 1 ? "HTTP/1.1" : "HTTP/1.0";
requestHeaders.addSpdyRequestHeaders(httpEngine.method, httpEngine.uri.getScheme(),
HttpEngine.requestPath(httpEngine.policy.getURL()), version);
boolean hasRequestBody = httpEngine.hasRequestBody();

View File

@@ -16,8 +16,6 @@
package com.squareup.okhttp.internal.net.http;
import com.squareup.okhttp.internal.net.Dns;
import static com.squareup.okhttp.internal.net.http.HttpConnection.TLS_MODE_AGGRESSIVE;
import static com.squareup.okhttp.internal.net.http.HttpConnection.TLS_MODE_COMPATIBLE;
import com.squareup.okhttp.internal.net.ssl.SslContextBuilder;
import java.io.IOException;
import java.net.InetAddress;
@@ -74,7 +72,7 @@ public final class RouteSelectorTest extends TestCase {
assertTrue(routeSelector.hasNext());
dns.inetAddresses = makeFakeAddresses(255, 1);
assertConnection(routeSelector.next(),
address, NO_PROXY, dns.inetAddresses[0], uriPort, TLS_MODE_COMPATIBLE);
address, NO_PROXY, dns.inetAddresses[0], uriPort, false);
dns.assertRequests(uriHost);
assertFalse(routeSelector.hasNext());
@@ -92,9 +90,9 @@ public final class RouteSelectorTest extends TestCase {
assertTrue(routeSelector.hasNext());
dns.inetAddresses = makeFakeAddresses(255, 2);
assertConnection(routeSelector.next(),
address, proxyA, dns.inetAddresses[0], proxyAPort, TLS_MODE_COMPATIBLE);
address, proxyA, dns.inetAddresses[0], proxyAPort, false);
assertConnection(routeSelector.next(),
address, proxyA, dns.inetAddresses[1], proxyAPort, TLS_MODE_COMPATIBLE);
address, proxyA, dns.inetAddresses[1], proxyAPort, false);
assertFalse(routeSelector.hasNext());
dns.assertRequests(proxyAHost);
@@ -108,9 +106,9 @@ public final class RouteSelectorTest extends TestCase {
assertTrue(routeSelector.hasNext());
dns.inetAddresses = makeFakeAddresses(255, 2);
assertConnection(routeSelector.next(),
address, NO_PROXY, dns.inetAddresses[0], uriPort, TLS_MODE_COMPATIBLE);
address, NO_PROXY, dns.inetAddresses[0], uriPort, false);
assertConnection(routeSelector.next(),
address, NO_PROXY, dns.inetAddresses[1], uriPort, TLS_MODE_COMPATIBLE);
address, NO_PROXY, dns.inetAddresses[1], uriPort, false);
assertFalse(routeSelector.hasNext());
dns.assertRequests(uri.getHost());
@@ -127,7 +125,7 @@ public final class RouteSelectorTest extends TestCase {
assertTrue(routeSelector.hasNext());
dns.inetAddresses = makeFakeAddresses(255, 1);
assertConnection(routeSelector.next(),
address, NO_PROXY, dns.inetAddresses[0], uriPort, TLS_MODE_COMPATIBLE);
address, NO_PROXY, dns.inetAddresses[0], uriPort, false);
dns.assertRequests(uriHost);
assertFalse(routeSelector.hasNext());
@@ -140,9 +138,9 @@ public final class RouteSelectorTest extends TestCase {
assertTrue(routeSelector.hasNext());
dns.inetAddresses = makeFakeAddresses(255, 2);
assertConnection(routeSelector.next(),
address, NO_PROXY, dns.inetAddresses[0], uriPort, TLS_MODE_COMPATIBLE);
address, NO_PROXY, dns.inetAddresses[0], uriPort, false);
assertConnection(routeSelector.next(),
address, NO_PROXY, dns.inetAddresses[1], uriPort, TLS_MODE_COMPATIBLE);
address, NO_PROXY, dns.inetAddresses[1], uriPort, false);
assertFalse(routeSelector.hasNext());
dns.assertRequests(uri.getHost());
@@ -161,23 +159,23 @@ public final class RouteSelectorTest extends TestCase {
assertTrue(routeSelector.hasNext());
dns.inetAddresses = makeFakeAddresses(255, 2);
assertConnection(routeSelector.next(),
address, proxyA, dns.inetAddresses[0], proxyAPort, TLS_MODE_COMPATIBLE);
address, proxyA, dns.inetAddresses[0], proxyAPort, false);
assertConnection(routeSelector.next(),
address, proxyA, dns.inetAddresses[1], proxyAPort, TLS_MODE_COMPATIBLE);
address, proxyA, dns.inetAddresses[1], proxyAPort, false);
dns.assertRequests(proxyAHost);
// Next try the IP address of the second proxy.
assertTrue(routeSelector.hasNext());
dns.inetAddresses = makeFakeAddresses(254, 1);
assertConnection(routeSelector.next(),
address, proxyB, dns.inetAddresses[0], proxyBPort, TLS_MODE_COMPATIBLE);
address, proxyB, dns.inetAddresses[0], proxyBPort, false);
dns.assertRequests(proxyBHost);
// Finally try the only IP address of the origin server.
assertTrue(routeSelector.hasNext());
dns.inetAddresses = makeFakeAddresses(253, 1);
assertConnection(routeSelector.next(),
address, NO_PROXY, dns.inetAddresses[0], uriPort, TLS_MODE_COMPATIBLE);
address, NO_PROXY, dns.inetAddresses[0], uriPort, false);
dns.assertRequests(uriHost);
assertFalse(routeSelector.hasNext());
@@ -194,7 +192,7 @@ public final class RouteSelectorTest extends TestCase {
assertTrue(routeSelector.hasNext());
dns.inetAddresses = makeFakeAddresses(255, 1);
assertConnection(routeSelector.next(),
address, NO_PROXY, dns.inetAddresses[0], uriPort, TLS_MODE_COMPATIBLE);
address, NO_PROXY, dns.inetAddresses[0], uriPort, false);
dns.assertRequests(uriHost);
assertFalse(routeSelector.hasNext());
@@ -212,7 +210,7 @@ public final class RouteSelectorTest extends TestCase {
assertTrue(routeSelector.hasNext());
dns.inetAddresses = makeFakeAddresses(255, 1);
assertConnection(routeSelector.next(),
address, proxyA, dns.inetAddresses[0], proxyAPort, TLS_MODE_COMPATIBLE);
address, proxyA, dns.inetAddresses[0], proxyAPort, false);
dns.assertRequests(proxyAHost);
assertTrue(routeSelector.hasNext());
@@ -227,13 +225,13 @@ public final class RouteSelectorTest extends TestCase {
assertTrue(routeSelector.hasNext());
dns.inetAddresses = makeFakeAddresses(255, 1);
assertConnection(routeSelector.next(),
address, proxyA, dns.inetAddresses[0], proxyAPort, TLS_MODE_COMPATIBLE);
address, proxyA, dns.inetAddresses[0], proxyAPort, false);
dns.assertRequests(proxyAHost);
assertTrue(routeSelector.hasNext());
dns.inetAddresses = makeFakeAddresses(254, 1);
assertConnection(routeSelector.next(),
address, NO_PROXY, dns.inetAddresses[0], uriPort, TLS_MODE_COMPATIBLE);
address, NO_PROXY, dns.inetAddresses[0], uriPort, false);
dns.assertRequests(uriHost);
assertFalse(routeSelector.hasNext());
@@ -247,12 +245,12 @@ public final class RouteSelectorTest extends TestCase {
assertTrue(routeSelector.hasNext());
dns.inetAddresses = makeFakeAddresses(255, 1);
assertConnection(routeSelector.next(),
address, NO_PROXY, dns.inetAddresses[0], uriPort, TLS_MODE_AGGRESSIVE);
address, NO_PROXY, dns.inetAddresses[0], uriPort, true);
dns.assertRequests(uriHost);
assertTrue(routeSelector.hasNext());
assertConnection(routeSelector.next(),
address, NO_PROXY, dns.inetAddresses[0], uriPort, TLS_MODE_COMPATIBLE);
address, NO_PROXY, dns.inetAddresses[0], uriPort, false);
dns.assertRequests(); // No more DNS requests since the previous!
assertFalse(routeSelector.hasNext());
@@ -268,49 +266,49 @@ public final class RouteSelectorTest extends TestCase {
// Proxy A
dns.inetAddresses = makeFakeAddresses(255, 2);
assertConnection(routeSelector.next(),
address, proxyA, dns.inetAddresses[0], proxyAPort, TLS_MODE_AGGRESSIVE);
address, proxyA, dns.inetAddresses[0], proxyAPort, true);
dns.assertRequests(proxyAHost);
assertConnection(routeSelector.next(),
address, proxyA, dns.inetAddresses[0], proxyAPort, TLS_MODE_COMPATIBLE);
address, proxyA, dns.inetAddresses[0], proxyAPort, false);
assertConnection(routeSelector.next(),
address, proxyA, dns.inetAddresses[1], proxyAPort, TLS_MODE_AGGRESSIVE);
address, proxyA, dns.inetAddresses[1], proxyAPort, true);
assertConnection(routeSelector.next(),
address, proxyA, dns.inetAddresses[1], proxyAPort, TLS_MODE_COMPATIBLE);
address, proxyA, dns.inetAddresses[1], proxyAPort, false);
// Proxy B
dns.inetAddresses = makeFakeAddresses(254, 2);
assertConnection(routeSelector.next(),
address, proxyB, dns.inetAddresses[0], proxyBPort, TLS_MODE_AGGRESSIVE);
address, proxyB, dns.inetAddresses[0], proxyBPort, true);
dns.assertRequests(proxyBHost);
assertConnection(routeSelector.next(),
address, proxyB, dns.inetAddresses[0], proxyBPort, TLS_MODE_COMPATIBLE);
address, proxyB, dns.inetAddresses[0], proxyBPort, false);
assertConnection(routeSelector.next(),
address, proxyB, dns.inetAddresses[1], proxyBPort, TLS_MODE_AGGRESSIVE);
address, proxyB, dns.inetAddresses[1], proxyBPort, true);
assertConnection(routeSelector.next(),
address, proxyB, dns.inetAddresses[1], proxyBPort, TLS_MODE_COMPATIBLE);
address, proxyB, dns.inetAddresses[1], proxyBPort, false);
// Origin
dns.inetAddresses = makeFakeAddresses(253, 2);
assertConnection(routeSelector.next(),
address, NO_PROXY, dns.inetAddresses[0], uriPort, TLS_MODE_AGGRESSIVE);
address, NO_PROXY, dns.inetAddresses[0], uriPort, true);
dns.assertRequests(uriHost);
assertConnection(routeSelector.next(),
address, NO_PROXY, dns.inetAddresses[0], uriPort, TLS_MODE_COMPATIBLE);
address, NO_PROXY, dns.inetAddresses[0], uriPort, false);
assertConnection(routeSelector.next(),
address, NO_PROXY, dns.inetAddresses[1], uriPort, TLS_MODE_AGGRESSIVE);
address, NO_PROXY, dns.inetAddresses[1], uriPort, true);
assertConnection(routeSelector.next(),
address, NO_PROXY, dns.inetAddresses[1], uriPort, TLS_MODE_COMPATIBLE);
address, NO_PROXY, dns.inetAddresses[1], uriPort, false);
assertFalse(routeSelector.hasNext());
}
private void assertConnection(HttpConnection connection, HttpConnection.Address address,
Proxy proxy, InetAddress socketAddress, int socketPort, int tlsMode) {
assertEquals(address, connection.address);
assertEquals(proxy, connection.proxy);
assertEquals(socketAddress, connection.inetSocketAddress.getAddress());
assertEquals(socketPort, connection.inetSocketAddress.getPort());
assertEquals(tlsMode, connection.tlsMode);
Proxy proxy, InetAddress socketAddress, int socketPort, boolean modernTls) {
assertEquals(address, connection.getAddress());
assertEquals(proxy, connection.getProxy());
assertEquals(socketAddress, connection.getSocketAddress().getAddress());
assertEquals(socketPort, connection.getSocketAddress().getPort());
assertEquals(modernTls, connection.isModernTls());
}
private static InetAddress[] makeFakeAddresses(int prefix, int count) {