1 /*
2 * $Header: /home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HostConfiguration.java,v 1.11.2.2 2003/09/05 02:09:41 mbecke Exp $
3 * $Revision: 1.11.2.2 $
4 * $Date: 2003/09/05 02:09:41 $
5 *
6 * ====================================================================
7 *
8 * The Apache Software License, Version 1.1
9 *
10 * Copyright (c) 2002-2003 The Apache Software Foundation. All rights
11 * reserved.
12 *
13 * Redistribution and use in source and binary forms, with or without
14 * modification, are permitted provided that the following conditions
15 * are met:
16 *
17 * 1. Redistributions of source code must retain the above copyright
18 * notice, this list of conditions and the following disclaimer.
19 *
20 * 2. Redistributions in binary form must reproduce the above copyright
21 * notice, this list of conditions and the following disclaimer in
22 * the documentation and/or other materials provided with the
23 * distribution.
24 *
25 * 3. The end-user documentation included with the redistribution, if
26 * any, must include the following acknowlegement:
27 * "This product includes software developed by the
28 * Apache Software Foundation (http://www.apache.org/)."
29 * Alternately, this acknowlegement may appear in the software itself,
30 * if and wherever such third-party acknowlegements normally appear.
31 *
32 * 4. The names "The Jakarta Project", "Commons", and "Apache Software
33 * Foundation" must not be used to endorse or promote products derived
34 * from this software without prior written permission. For written
35 * permission, please contact apache@apache.org.
36 *
37 * 5. Products derived from this software may not be called "Apache"
38 * nor may "Apache" appear in their names without prior written
39 * permission of the Apache Group.
40 *
41 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
42 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
43 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
44 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
45 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
46 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
47 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
48 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
49 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
50 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
51 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
52 * SUCH DAMAGE.
53 * ====================================================================
54 *
55 * This software consists of voluntary contributions made by many
56 * individuals on behalf of the Apache Software Foundation. For more
57 * information on the Apache Software Foundation, please see
58 * <http://www.apache.org/>.
59 *
60 * [Additional notices, if required by prior licensing conditions]
61 *
62 */
63
64 package org.apache.commons.httpclient;
65
66 import org.apache.commons.httpclient.protocol.Protocol;
67
68 import java.net.InetAddress;
69
70 /***
71 * Holds all of the variables needed to describe an HTTP connection to a host. This includes
72 * remote host, port and protocol, proxy host and port, local address, and virtual host.
73 *
74 * @author <a href="mailto:becke@u.washington.edu">Michael Becke</a>
75 * @author <a href="mailto:mbowler@GargoyleSoftware.com">Mike Bowler</a>
76 * @author <a href="mailto:oleg@ural.ru">Oleg Kalnichevski</a>
77 * @author Laura Werner
78 *
79 * @since 2.0
80 */
81 public class HostConfiguration implements Cloneable {
82
83 /*** The host to use. */
84 private String host;
85
86 /*** The virtual host to use. */
87 private String virtualHost;
88
89 /*** The port to use. */
90 private int port;
91
92 /*** The protocol */
93 private Protocol protocol;
94
95 /*** True if a host has been set */
96 private boolean hostSet;
97
98 /*** The host name of the proxy server */
99 private String proxyHost;
100
101 /*** The port number of the proxy server */
102 private int proxyPort;
103
104 /*** True if a proxy server has been set */
105 private boolean proxySet;
106
107 /*** The local address to use when creating the socket, or null to use the default */
108 private InetAddress localAddress;
109
110 /***
111 * Constructor for HostConfiguration.
112 */
113 public HostConfiguration() {
114
115 this.host = null;
116 this.virtualHost = null;
117 this.port = -1;
118 this.protocol = null;
119 this.hostSet = false;
120
121 this.proxyHost = null;
122 this.proxyPort = -1;
123 this.proxySet = false;
124 this.localAddress = null;
125 }
126
127 /***
128 * Copy constructor for HostConfiguration
129 *
130 * @param hostConfiguration the hostConfiguration to copy
131 */
132 public HostConfiguration (HostConfiguration hostConfiguration) {
133
134 // wrap all of the assignments in a synchronized block to avoid
135 // having to negotiate the monitor for each method call
136 synchronized (hostConfiguration) {
137 this.host = hostConfiguration.getHost();
138 this.virtualHost = hostConfiguration.getVirtualHost();
139 this.port = hostConfiguration.getPort();
140 this.protocol = hostConfiguration.getProtocol();
141 this.hostSet = hostConfiguration.isHostSet();
142
143 this.proxyHost = hostConfiguration.getProxyHost();
144 this.proxyPort = hostConfiguration.getProxyPort();
145 this.proxySet = hostConfiguration.isProxySet();
146 this.localAddress = hostConfiguration.getLocalAddress();
147 }
148
149 }
150
151 /***
152 * @see java.lang.Object#clone()
153 */
154 public Object clone() {
155 return new HostConfiguration(this);
156 }
157
158 /***
159 * @see java.lang.Object#toString()
160 */
161 public synchronized String toString() {
162
163 boolean appendComma = false;
164
165 StringBuffer b = new StringBuffer(50);
166 b.append("HostConfiguration[");
167
168 if (isHostSet()) {
169 appendComma = true;
170 b.append("host=").append(host);
171 b.append(", protocol=").append(protocol);
172 b.append(", port=").append(port);
173 if (virtualHost != null) {
174 b.append(", virtualHost=").append(virtualHost);
175 }
176 }
177 if (isProxySet()) {
178 if (appendComma) {
179 b.append(", ");
180 } else {
181 appendComma = true;
182 }
183 b.append("proxyHost=").append(proxyHost);
184 b.append(", proxyPort=").append(proxyPort);
185 }
186 if (localAddress != null) {
187 if (appendComma) {
188 b.append(", ");
189 } else {
190 appendComma = true;
191 }
192 b.append("localAddress=").append(localAddress);
193 }
194
195 b.append("]");
196 return b.toString();
197 }
198
199 /***
200 * Tests if the host configuration equals the configuration set on the
201 * connection. True only if the host, port, protocol, local address and virtual address
202 * are equal. If no host configuration has been set false will be returned.
203 *
204 * @param connection the connection to test against
205 * @return <code>true</code> if the connection's host information equals that of this
206 * configuration
207 *
208 * @see #proxyEquals(HttpConnection)
209 * @see #isHostSet()
210 */
211 public synchronized boolean hostEquals(HttpConnection connection) {
212
213 if (hostSet) {
214 if (!this.host.equalsIgnoreCase(connection.getHost())) {
215 return false;
216 }
217 if (this.virtualHost != null) {
218 if (!this.virtualHost.equalsIgnoreCase(connection.getVirtualHost())) {
219 return false;
220 }
221 } else {
222 if (connection.getVirtualHost() != null) {
223 return false;
224 }
225 }
226 if (this.port != connection.getPort()) {
227 return false;
228 }
229 if (!this.protocol.equals(connection.getProtocol())) {
230 return false;
231 }
232 if (this.localAddress != null) {
233 if (!this.localAddress.equals(connection.getLocalAddress())) {
234 return false;
235 }
236 } else {
237 if (connection.getLocalAddress() != null) {
238 return false;
239 }
240 }
241 return true;
242 } else {
243 return false;
244 }
245
246 }
247
248 /***
249 * Tests if the proxy configuration equals the configuration set on the
250 * connection. True only if the proxyHost and proxyPort are equal.
251 *
252 * @param connection the connection to test against
253 * @return <code>true</code> if the connection's proxy information equals that of this
254 * configuration
255 *
256 * @see #hostEquals(HttpConnection)
257 */
258 public synchronized boolean proxyEquals(HttpConnection connection) {
259
260 if (proxyHost == null) {
261 return connection.getProxyHost() == null;
262 } else {
263 return (
264 proxyHost.equalsIgnoreCase(connection.getProxyHost())
265 && proxyPort == connection.getProxyPort()
266 );
267 }
268 }
269
270 /***
271 * Returns true if the host is set.
272 * @return <code>true</code> if the host is set.
273 */
274 public synchronized boolean isHostSet() {
275 return hostSet;
276 }
277
278 /***
279 * Sets the given host, port and protocol
280 *
281 * @param host the host(IP or DNS name)
282 * @param port The port
283 * @param protocol The protocol.
284 */
285 public synchronized void setHost(String host, int port, String protocol) {
286 setHost(host, null, port, Protocol.getProtocol(protocol));
287 }
288
289 /***
290 * Sets the given host, virtual host, port and protocol.
291 *
292 * @param host the host(IP or DNS name)
293 * @param virtualHost the virtual host name or <code>null</code>
294 * @param port the host port or -1 to use protocol default
295 * @param protocol the protocol
296 */
297 public synchronized void setHost(String host, String virtualHost, int port,
298 Protocol protocol) {
299
300 if (host == null) {
301 throw new IllegalArgumentException("host must not be null");
302 }
303 if (protocol == null) {
304 throw new IllegalArgumentException("protocol must not be null");
305 }
306
307 this.host = host;
308 this.virtualHost = virtualHost;
309 this.port = port == -1 ? protocol.getDefaultPort() : port;
310 this.protocol = protocol;
311
312 this.hostSet = true;
313 }
314
315 /***
316 * Sets the given host, port and protocol.
317 *
318 * @param host the host(IP or DNS name)
319 * @param port The port
320 * @param protocol the protocol
321 */
322 public synchronized void setHost(String host, int port, Protocol protocol) {
323 setHost(host, null, port, protocol);
324 }
325
326 /***
327 * Sets the given host and port. Uses the default protocol "http".
328 *
329 * @param host the host(IP or DNS name)
330 * @param port The port
331 */
332 public synchronized void setHost(String host, int port) {
333 setHost(host, null, port, Protocol.getProtocol("http"));
334 }
335
336 /***
337 * Set the given host. Uses the default protocol("http") and its port.
338 *
339 * @param host The host(IP or DNS name).
340 */
341 public synchronized void setHost(String host) {
342 Protocol defaultProtocol = Protocol.getProtocol("http");
343 setHost(host, null, defaultProtocol.getDefaultPort(), defaultProtocol);
344 }
345
346 /***
347 * Sets the protocol, host and port from the given URI.
348 * @param uri the URI.
349 */
350 public synchronized void setHost(URI uri) {
351 try {
352 setHost(uri.getHost(), uri.getPort(), uri.getScheme());
353 } catch (URIException e) {
354 throw new IllegalArgumentException(e.toString());
355 }
356 }
357
358 /***
359 * Return the host url.
360 *
361 * @return The host url.
362 */
363 public synchronized String getHostURL() {
364
365 if (!hostSet) {
366 throw new IllegalStateException("a default host must be set to "
367 + "create a host URL"
368 );
369 }
370
371 String url = protocol.getScheme() + "://" + host;
372
373 if (port != -1 && port != protocol.getDefaultPort()) {
374 url += ":" + port;
375 }
376
377 return url;
378 }
379
380 /***
381 * Returns the host.
382 *
383 * @return the host(IP or DNS name), or <code>null</code> if not set
384 *
385 * @see #isHostSet()
386 */
387 public synchronized String getHost() {
388 return host;
389 }
390
391 /***
392 * Returns the virtual host.
393 *
394 * @return the virtual host name, or <code>null</code> if not set
395 */
396 public synchronized String getVirtualHost() {
397 return virtualHost;
398 }
399
400 /***
401 * Returns the port.
402 *
403 * @return the host port, or <code>-1</code> if not set
404 *
405 * @see #isHostSet()
406 */
407 public synchronized int getPort() {
408 return port;
409 }
410
411 /***
412 * Returns the protocol.
413 * @return The protocol.
414 */
415 public synchronized Protocol getProtocol() {
416 return protocol;
417 }
418
419 /***
420 * Tests if the proxy host/port have been set.
421 *
422 * @return <code>true</code> if a proxy server has been set.
423 *
424 * @see #setProxy(String, int)
425 */
426 public synchronized boolean isProxySet() {
427 return proxySet;
428 }
429
430 /***
431 * Set the proxy settings.
432 * @param proxyHost The proxy host
433 * @param proxyPort The proxy port
434 */
435 public synchronized void setProxy(String proxyHost, int proxyPort) {
436
437 this.proxyHost = proxyHost;
438 this.proxyPort = proxyPort;
439
440 this.proxySet = true;
441 }
442
443 /***
444 * Returns the proxyHost.
445 *
446 * @return the proxy host, or <code>null</code> if not set
447 *
448 * @see #isProxySet()
449 */
450 public synchronized String getProxyHost() {
451 return proxyHost;
452 }
453
454 /***
455 * Returns the proxyPort.
456 *
457 * @return the proxy port, or <code>-1</code> if not set
458 *
459 * @see #isProxySet()
460 */
461 public synchronized int getProxyPort() {
462 return proxyPort;
463 }
464
465 /***
466 * Set the local address to be used when creating connections.
467 * If this is unset, the default address will be used.
468 * This is useful for specifying the interface to use on multi-homed or clustered systems.
469 *
470 * @param localAddress the local address to use
471 */
472 public synchronized void setLocalAddress(InetAddress localAddress) {
473 this.localAddress = localAddress;
474 }
475
476 /***
477 * Return the local address to be used when creating connections.
478 * If this is unset, the default address should be used.
479 *
480 * @return the local address to be used when creating Sockets, or <code>null</code>
481 */
482 public synchronized InetAddress getLocalAddress() {
483 return this.localAddress;
484 }
485
486 /***
487 * @see java.lang.Object#equals(java.lang.Object)
488 */
489 public synchronized boolean equals(Object o) {
490
491 if (o instanceof HostConfiguration) {
492
493 // shortcut if we're comparing with ourselves
494 if (o == this) {
495 return true;
496 }
497
498 HostConfiguration config = (HostConfiguration) o;
499
500 if (hostSet) {
501 if (!host.equalsIgnoreCase(config.getHost())) {
502 return false;
503 }
504 if (virtualHost != null) {
505 if (!virtualHost.equalsIgnoreCase(config.getVirtualHost())) {
506 return false;
507 }
508 } else {
509 if (config.getVirtualHost() != null) {
510 return false;
511 }
512 }
513 if (port != config.getPort()) {
514 return false;
515 }
516 if (!protocol.equals(config.getProtocol())) {
517 return false;
518 }
519 } else if (config.isHostSet()) {
520 return false;
521 }
522 if (proxyHost != null) {
523 if (!proxyHost.equalsIgnoreCase (config.getProxyHost())
524 || proxyPort != config.getProxyPort()) {
525 // either proxyHost or proxyPort don't match
526 return false;
527 }
528 } else if (config.getProxyHost() != null) {
529 return false;
530 }
531 if (localAddress != null) {
532 if (!localAddress.equals(config.getLocalAddress())) {
533 return false;
534 }
535 } else {
536 if (config.getLocalAddress() != null) {
537 return false;
538 }
539 }
540
541 // everything matches
542 return true;
543
544 } else {
545 return false;
546 }
547
548 }
549
550 /***
551 * @see java.lang.Object#hashCode()
552 */
553 public int hashCode() {
554
555 if (host != null) {
556 return host.hashCode();
557 } else if (proxyHost != null) {
558 return proxyHost.hashCode();
559 } else {
560 return super.hashCode();
561 }
562 }
563 }
This page was automatically generated by Maven