Home | History | Annotate | Download | only in routing
      1 /*
      2  * $HeadURL: http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/module-client/src/main/java/org/apache/http/conn/routing/RouteInfo.java $
      3  * $Revision: 652200 $
      4  * $Date: 2008-04-29 17:22:43 -0700 (Tue, 29 Apr 2008) $
      5  *
      6  * ====================================================================
      7  * Licensed to the Apache Software Foundation (ASF) under one
      8  * or more contributor license agreements.  See the NOTICE file
      9  * distributed with this work for additional information
     10  * regarding copyright ownership.  The ASF licenses this file
     11  * to you under the Apache License, Version 2.0 (the
     12  * "License"); you may not use this file except in compliance
     13  * with the License.  You may obtain a copy of the License at
     14  *
     15  *   http://www.apache.org/licenses/LICENSE-2.0
     16  *
     17  * Unless required by applicable law or agreed to in writing,
     18  * software distributed under the License is distributed on an
     19  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
     20  * KIND, either express or implied.  See the License for the
     21  * specific language governing permissions and limitations
     22  * under the License.
     23  * ====================================================================
     24  *
     25  * This software consists of voluntary contributions made by many
     26  * individuals on behalf of the Apache Software Foundation.  For more
     27  * information on the Apache Software Foundation, please see
     28  * <http://www.apache.org/>.
     29  *
     30  */
     31 
     32 package org.apache.http.conn.routing;
     33 
     34 import java.net.InetAddress;
     35 
     36 import org.apache.http.HttpHost;
     37 
     38 
     39 /**
     40  * Read-only interface for route information.
     41  *
     42  * @author <a href="mailto:rolandw at apache.org">Roland Weber</a>
     43  *
     44  *
     45  * <!-- empty lines to avoid svn diff problems -->
     46  * @version $Revision: 652200 $
     47  *
     48  * @since 4.0
     49  */
     50 public interface RouteInfo {
     51 
     52     /**
     53      * The tunnelling type of a route.
     54      * Plain routes are established by connecting to the target or
     55      * the first proxy.
     56      * Tunnelled routes are established by connecting to the first proxy
     57      * and tunnelling through all proxies to the target.
     58      * Routes without a proxy cannot be tunnelled.
     59      */
     60     public enum TunnelType { PLAIN, TUNNELLED }
     61 
     62     /**
     63      * The layering type of a route.
     64      * Plain routes are established by connecting or tunnelling.
     65      * Layered routes are established by layering a protocol such as TLS/SSL
     66      * over an existing connection.
     67      * Protocols can only be layered over a tunnel to the target, or
     68      * or over a direct connection without proxies.
     69      * <br/>
     70      * Layering a protocol
     71      * over a direct connection makes little sense, since the connection
     72      * could be established with the new protocol in the first place.
     73      * But we don't want to exclude that use case.
     74      */
     75     public enum LayerType  { PLAIN, LAYERED }
     76 
     77 
     78 
     79     /**
     80      * Obtains the target host.
     81      *
     82      * @return the target host
     83      */
     84     HttpHost getTargetHost()
     85         ;
     86 
     87 
     88     /**
     89      * Obtains the local address to connect from.
     90      *
     91      * @return  the local address,
     92      *          or <code>null</code>
     93      */
     94     InetAddress getLocalAddress()
     95         ;
     96 
     97 
     98     /**
     99      * Obtains the number of hops in this route.
    100      * A direct route has one hop. A route through a proxy has two hops.
    101      * A route through a chain of <i>n</i> proxies has <i>n+1</i> hops.
    102      *
    103      * @return  the number of hops in this route
    104      */
    105     int getHopCount()
    106         ;
    107 
    108 
    109     /**
    110      * Obtains the target of a hop in this route.
    111      * The target of the last hop is the {@link #getTargetHost target host},
    112      * the target of previous hops is the respective proxy in the chain.
    113      * For a route through exactly one proxy, target of hop 0 is the proxy
    114      * and target of hop 1 is the target host.
    115      *
    116      * @param hop       index of the hop for which to get the target,
    117      *                  0 for first
    118      *
    119      * @return  the target of the given hop
    120      *
    121      * @throws IllegalArgumentException
    122      *  if the argument is negative or not less than
    123      *  {@link #getHopCount getHopCount()}
    124      */
    125     HttpHost getHopTarget(int hop)
    126         ;
    127 
    128 
    129     /**
    130      * Obtains the first proxy host.
    131      *
    132      * @return the first proxy in the proxy chain, or
    133      *         <code>null</code> if this route is direct
    134      */
    135     HttpHost getProxyHost()
    136         ;
    137 
    138 
    139     /**
    140      * Obtains the tunnel type of this route.
    141      * If there is a proxy chain, only end-to-end tunnels are considered.
    142      *
    143      * @return  the tunnelling type
    144      */
    145     TunnelType getTunnelType()
    146         ;
    147 
    148 
    149     /**
    150      * Checks whether this route is tunnelled through a proxy.
    151      * If there is a proxy chain, only end-to-end tunnels are considered.
    152      *
    153      * @return  <code>true</code> if tunnelled end-to-end through at least
    154      *          one proxy,
    155      *          <code>false</code> otherwise
    156      */
    157     boolean isTunnelled()
    158         ;
    159 
    160 
    161     /**
    162      * Obtains the layering type of this route.
    163      * In the presence of proxies, only layering over an end-to-end tunnel
    164      * is considered.
    165      *
    166      * @return  the layering type
    167      */
    168     LayerType getLayerType()
    169         ;
    170 
    171 
    172     /**
    173      * Checks whether this route includes a layered protocol.
    174      * In the presence of proxies, only layering over an end-to-end tunnel
    175      * is considered.
    176      *
    177      * @return  <code>true</code> if layered,
    178      *          <code>false</code> otherwise
    179      */
    180     boolean isLayered()
    181         ;
    182 
    183 
    184     /**
    185      * Checks whether this route is secure.
    186      *
    187      * @return  <code>true</code> if secure,
    188      *          <code>false</code> otherwise
    189      */
    190     boolean isSecure()
    191         ;
    192 
    193 
    194 } // interface RouteInfo
    195