1 /* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.squareup.okhttp; 17 18 import com.squareup.okhttp.internal.Util; 19 import java.net.Proxy; 20 import java.net.ProxySelector; 21 import java.util.List; 22 import javax.net.SocketFactory; 23 import javax.net.ssl.HostnameVerifier; 24 import javax.net.ssl.SSLSocketFactory; 25 26 import static com.squareup.okhttp.internal.Util.equal; 27 28 /** 29 * A specification for a connection to an origin server. For simple connections, 30 * this is the server's hostname and port. If an explicit proxy is requested (or 31 * {@linkplain Proxy#NO_PROXY no proxy} is explicitly requested), this also includes 32 * that proxy information. For secure connections the address also includes the 33 * SSL socket factory, hostname verifier, and certificate pinner. 34 * 35 * <p>HTTP requests that share the same {@code Address} may also share the same 36 * {@link Connection}. 37 */ 38 public final class Address { 39 final HttpUrl url; 40 final Dns dns; 41 final SocketFactory socketFactory; 42 final Authenticator authenticator; 43 final List<Protocol> protocols; 44 final List<ConnectionSpec> connectionSpecs; 45 final ProxySelector proxySelector; 46 final Proxy proxy; 47 final SSLSocketFactory sslSocketFactory; 48 final HostnameVerifier hostnameVerifier; 49 final CertificatePinner certificatePinner; 50 Address(String uriHost, int uriPort, Dns dns, SocketFactory socketFactory, SSLSocketFactory sslSocketFactory, HostnameVerifier hostnameVerifier, CertificatePinner certificatePinner, Authenticator authenticator, Proxy proxy, List<Protocol> protocols, List<ConnectionSpec> connectionSpecs, ProxySelector proxySelector)51 public Address(String uriHost, int uriPort, Dns dns, SocketFactory socketFactory, 52 SSLSocketFactory sslSocketFactory, HostnameVerifier hostnameVerifier, 53 CertificatePinner certificatePinner, Authenticator authenticator, Proxy proxy, 54 List<Protocol> protocols, List<ConnectionSpec> connectionSpecs, ProxySelector proxySelector) { 55 this.url = new HttpUrl.Builder() 56 .scheme(sslSocketFactory != null ? "https" : "http") 57 .host(uriHost) 58 .port(uriPort) 59 .build(); 60 61 if (dns == null) throw new IllegalArgumentException("dns == null"); 62 this.dns = dns; 63 64 if (socketFactory == null) throw new IllegalArgumentException("socketFactory == null"); 65 this.socketFactory = socketFactory; 66 67 if (authenticator == null) throw new IllegalArgumentException("authenticator == null"); 68 this.authenticator = authenticator; 69 70 if (protocols == null) throw new IllegalArgumentException("protocols == null"); 71 this.protocols = Util.immutableList(protocols); 72 73 if (connectionSpecs == null) throw new IllegalArgumentException("connectionSpecs == null"); 74 this.connectionSpecs = Util.immutableList(connectionSpecs); 75 76 if (proxySelector == null) throw new IllegalArgumentException("proxySelector == null"); 77 this.proxySelector = proxySelector; 78 79 this.proxy = proxy; 80 this.sslSocketFactory = sslSocketFactory; 81 this.hostnameVerifier = hostnameVerifier; 82 this.certificatePinner = certificatePinner; 83 } 84 85 /** 86 * Returns a URL with the hostname and port of the origin server. The path, query, and fragment of 87 * this URL are always empty, since they are not significant for planning a route. 88 */ url()89 public HttpUrl url() { 90 return url; 91 } 92 93 /** 94 * Returns the hostname of the origin server. 95 * 96 * @deprecated prefer {@code address.url().host()}. 97 */ 98 @Deprecated getUriHost()99 public String getUriHost() { 100 return url.host(); 101 } 102 103 /** 104 * Returns the port of the origin server; typically 80 or 443. Unlike 105 * may {@code getPort()} accessors, this method never returns -1. 106 * 107 * @deprecated prefer {@code address.url().port()}. 108 */ 109 @Deprecated getUriPort()110 public int getUriPort() { 111 return url.port(); 112 } 113 114 /** Returns the service that will be used to resolve IP addresses for hostnames. */ getDns()115 public Dns getDns() { 116 return dns; 117 } 118 119 /** Returns the socket factory for new connections. */ getSocketFactory()120 public SocketFactory getSocketFactory() { 121 return socketFactory; 122 } 123 124 /** Returns the client's authenticator. */ getAuthenticator()125 public Authenticator getAuthenticator() { 126 return authenticator; 127 } 128 129 /** 130 * Returns the protocols the client supports. This method always returns a 131 * non-null list that contains minimally {@link Protocol#HTTP_1_1}. 132 */ getProtocols()133 public List<Protocol> getProtocols() { 134 return protocols; 135 } 136 getConnectionSpecs()137 public List<ConnectionSpec> getConnectionSpecs() { 138 return connectionSpecs; 139 } 140 141 /** 142 * Returns this address's proxy selector. Only used if the proxy is null. If none of this 143 * selector's proxies are reachable, a direct connection will be attempted. 144 */ getProxySelector()145 public ProxySelector getProxySelector() { 146 return proxySelector; 147 } 148 149 /** 150 * Returns this address's explicitly-specified HTTP proxy, or null to 151 * delegate to the {@linkplain #getProxySelector proxy selector}. 152 */ getProxy()153 public Proxy getProxy() { 154 return proxy; 155 } 156 157 /** Returns the SSL socket factory, or null if this is not an HTTPS address. */ getSslSocketFactory()158 public SSLSocketFactory getSslSocketFactory() { 159 return sslSocketFactory; 160 } 161 162 /** Returns the hostname verifier, or null if this is not an HTTPS address. */ getHostnameVerifier()163 public HostnameVerifier getHostnameVerifier() { 164 return hostnameVerifier; 165 } 166 167 /** Returns this address's certificate pinner, or null if this is not an HTTPS address. */ getCertificatePinner()168 public CertificatePinner getCertificatePinner() { 169 return certificatePinner; 170 } 171 equals(Object other)172 @Override public boolean equals(Object other) { 173 if (other instanceof Address) { 174 Address that = (Address) other; 175 return this.url.equals(that.url) 176 && this.dns.equals(that.dns) 177 && this.authenticator.equals(that.authenticator) 178 && this.protocols.equals(that.protocols) 179 && this.connectionSpecs.equals(that.connectionSpecs) 180 && this.proxySelector.equals(that.proxySelector) 181 && equal(this.proxy, that.proxy) 182 && equal(this.sslSocketFactory, that.sslSocketFactory) 183 && equal(this.hostnameVerifier, that.hostnameVerifier) 184 && equal(this.certificatePinner, that.certificatePinner); 185 } 186 return false; 187 } 188 hashCode()189 @Override public int hashCode() { 190 int result = 17; 191 result = 31 * result + url.hashCode(); 192 result = 31 * result + dns.hashCode(); 193 result = 31 * result + authenticator.hashCode(); 194 result = 31 * result + protocols.hashCode(); 195 result = 31 * result + connectionSpecs.hashCode(); 196 result = 31 * result + proxySelector.hashCode(); 197 result = 31 * result + (proxy != null ? proxy.hashCode() : 0); 198 result = 31 * result + (sslSocketFactory != null ? sslSocketFactory.hashCode() : 0); 199 result = 31 * result + (hostnameVerifier != null ? hostnameVerifier.hashCode() : 0); 200 result = 31 * result + (certificatePinner != null ? certificatePinner.hashCode() : 0); 201 return result; 202 } 203 } 204