diff --git a/src/main/java/com/squareup/okhttp/internal/net/http/HttpConnection.java b/src/main/java/com/squareup/okhttp/internal/net/http/HttpConnection.java index 0771bbf4c..ed8925db6 100644 --- a/src/main/java/com/squareup/okhttp/internal/net/http/HttpConnection.java +++ b/src/main/java/com/squareup/okhttp/internal/net/http/HttpConnection.java @@ -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. * *

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. + * + *

Modern TLS

+ * There are tradeoffs when selecting which options to include when negotiating + * a secure connection to a remote host. Newer TLS options are quite useful: + * + * 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; diff --git a/src/main/java/com/squareup/okhttp/internal/net/http/HttpConnectionPool.java b/src/main/java/com/squareup/okhttp/internal/net/http/HttpConnectionPool.java index 08a0828a3..0bed1fd7c 100644 --- a/src/main/java/com/squareup/okhttp/internal/net/http/HttpConnectionPool.java +++ b/src/main/java/com/squareup/okhttp/internal/net/http/HttpConnectionPool.java @@ -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); } /** diff --git a/src/main/java/com/squareup/okhttp/internal/net/http/HttpEngine.java b/src/main/java/com/squareup/okhttp/internal/net/http/HttpEngine.java index a4809fffa..19bdb29fb 100644 --- a/src/main/java/com/squareup/okhttp/internal/net/http/HttpEngine.java +++ b/src/main/java/com/squareup/okhttp/internal/net/http/HttpEngine.java @@ -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; diff --git a/src/main/java/com/squareup/okhttp/internal/net/http/HttpTransport.java b/src/main/java/com/squareup/okhttp/internal/net/http/HttpTransport.java index 0d999d852..a1bbd48ad 100644 --- a/src/main/java/com/squareup/okhttp/internal/net/http/HttpTransport.java +++ b/src/main/java/com/squareup/okhttp/internal/net/http/HttpTransport.java @@ -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); } diff --git a/src/main/java/com/squareup/okhttp/internal/net/http/RouteSelector.java b/src/main/java/com/squareup/okhttp/internal/net/http/RouteSelector.java index 3b7bf463b..7af105273 100644 --- a/src/main/java/com/squareup/okhttp/internal/net/http/RouteSelector.java +++ b/src/main/java/com/squareup/okhttp/internal/net/http/RouteSelector.java @@ -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; diff --git a/src/main/java/com/squareup/okhttp/internal/net/http/SpdyTransport.java b/src/main/java/com/squareup/okhttp/internal/net/http/SpdyTransport.java index 1cad6be62..f0fc12388 100644 --- a/src/main/java/com/squareup/okhttp/internal/net/http/SpdyTransport.java +++ b/src/main/java/com/squareup/okhttp/internal/net/http/SpdyTransport.java @@ -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(); diff --git a/src/test/java/com/squareup/okhttp/internal/net/http/RouteSelectorTest.java b/src/test/java/com/squareup/okhttp/internal/net/http/RouteSelectorTest.java index e0514621e..0a9d50ea1 100644 --- a/src/test/java/com/squareup/okhttp/internal/net/http/RouteSelectorTest.java +++ b/src/test/java/com/squareup/okhttp/internal/net/http/RouteSelectorTest.java @@ -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) {