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:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user