Wed, 31 Dec 2014 07:22:50 +0100
Correct previous dual key logic pending first delivery installment.
1 /*
2 * ====================================================================
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 * ====================================================================
20 *
21 * This software consists of voluntary contributions made by many
22 * individuals on behalf of the Apache Software Foundation. For more
23 * information on the Apache Software Foundation, please see
24 * <http://www.apache.org/>.
25 *
26 */
28 package ch.boye.httpclientandroidlib;
30 import java.io.Serializable;
31 import java.util.Locale;
33 import ch.boye.httpclientandroidlib.util.CharArrayBuffer;
34 import ch.boye.httpclientandroidlib.util.LangUtils;
36 /**
37 * Holds all of the variables needed to describe an HTTP connection to a host.
38 * This includes remote host name, port and scheme.
39 *
40 *
41 * @since 4.0
42 */
43 //@Immutable
44 public final class HttpHost implements Cloneable, Serializable {
46 private static final long serialVersionUID = -7529410654042457626L;
48 /** The default scheme is "http". */
49 public static final String DEFAULT_SCHEME_NAME = "http";
51 /** The host to use. */
52 protected final String hostname;
54 /** The lowercase host, for {@link #equals} and {@link #hashCode}. */
55 protected final String lcHostname;
58 /** The port to use. */
59 protected final int port;
61 /** The scheme (lowercased) */
62 protected final String schemeName;
65 /**
66 * Creates a new {@link HttpHost HttpHost}, specifying all values.
67 * Constructor for HttpHost.
68 *
69 * @param hostname the hostname (IP or DNS name)
70 * @param port the port number.
71 * <code>-1</code> indicates the scheme default port.
72 * @param scheme the name of the scheme.
73 * <code>null</code> indicates the
74 * {@link #DEFAULT_SCHEME_NAME default scheme}
75 */
76 public HttpHost(final String hostname, int port, final String scheme) {
77 super();
78 if (hostname == null) {
79 throw new IllegalArgumentException("Host name may not be null");
80 }
81 this.hostname = hostname;
82 this.lcHostname = hostname.toLowerCase(Locale.ENGLISH);
83 if (scheme != null) {
84 this.schemeName = scheme.toLowerCase(Locale.ENGLISH);
85 } else {
86 this.schemeName = DEFAULT_SCHEME_NAME;
87 }
88 this.port = port;
89 }
91 /**
92 * Creates a new {@link HttpHost HttpHost}, with default scheme.
93 *
94 * @param hostname the hostname (IP or DNS name)
95 * @param port the port number.
96 * <code>-1</code> indicates the scheme default port.
97 */
98 public HttpHost(final String hostname, int port) {
99 this(hostname, port, null);
100 }
102 /**
103 * Creates a new {@link HttpHost HttpHost}, with default scheme and port.
104 *
105 * @param hostname the hostname (IP or DNS name)
106 */
107 public HttpHost(final String hostname) {
108 this(hostname, -1, null);
109 }
111 /**
112 * Copy constructor for {@link HttpHost HttpHost}.
113 *
114 * @param httphost the HTTP host to copy details from
115 */
116 public HttpHost (final HttpHost httphost) {
117 this(httphost.hostname, httphost.port, httphost.schemeName);
118 }
120 /**
121 * Returns the host name.
122 *
123 * @return the host name (IP or DNS name)
124 */
125 public String getHostName() {
126 return this.hostname;
127 }
129 /**
130 * Returns the port.
131 *
132 * @return the host port, or <code>-1</code> if not set
133 */
134 public int getPort() {
135 return this.port;
136 }
138 /**
139 * Returns the scheme name.
140 *
141 * @return the scheme name
142 */
143 public String getSchemeName() {
144 return this.schemeName;
145 }
147 /**
148 * Return the host URI, as a string.
149 *
150 * @return the host URI
151 */
152 public String toURI() {
153 CharArrayBuffer buffer = new CharArrayBuffer(32);
154 buffer.append(this.schemeName);
155 buffer.append("://");
156 buffer.append(this.hostname);
157 if (this.port != -1) {
158 buffer.append(':');
159 buffer.append(Integer.toString(this.port));
160 }
161 return buffer.toString();
162 }
165 /**
166 * Obtains the host string, without scheme prefix.
167 *
168 * @return the host string, for example <code>localhost:8080</code>
169 */
170 public String toHostString() {
171 if (this.port != -1) {
172 //the highest port number is 65535, which is length 6 with the addition of the colon
173 CharArrayBuffer buffer = new CharArrayBuffer(this.hostname.length() + 6);
174 buffer.append(this.hostname);
175 buffer.append(":");
176 buffer.append(Integer.toString(this.port));
177 return buffer.toString();
178 } else {
179 return this.hostname;
180 }
181 }
184 public String toString() {
185 return toURI();
186 }
189 public boolean equals(final Object obj) {
190 if (this == obj) return true;
191 if (obj instanceof HttpHost) {
192 HttpHost that = (HttpHost) obj;
193 return this.lcHostname.equals(that.lcHostname)
194 && this.port == that.port
195 && this.schemeName.equals(that.schemeName);
196 } else {
197 return false;
198 }
199 }
201 /**
202 * @see java.lang.Object#hashCode()
203 */
204 public int hashCode() {
205 int hash = LangUtils.HASH_SEED;
206 hash = LangUtils.hashCode(hash, this.lcHostname);
207 hash = LangUtils.hashCode(hash, this.port);
208 hash = LangUtils.hashCode(hash, this.schemeName);
209 return hash;
210 }
212 public Object clone() throws CloneNotSupportedException {
213 return super.clone();
214 }
216 }