Home | History | Annotate | Download | only in proxy
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef NET_PROXY_PROXY_INFO_H_
      6 #define NET_PROXY_PROXY_INFO_H_
      7 
      8 #include <string>
      9 
     10 #include "base/time/time.h"
     11 #include "net/base/net_export.h"
     12 #include "net/base/net_log.h"
     13 #include "net/proxy/proxy_config.h"
     14 #include "net/proxy/proxy_list.h"
     15 #include "net/proxy/proxy_retry_info.h"
     16 #include "net/proxy/proxy_server.h"
     17 
     18 namespace net {
     19 
     20 // This object holds proxy information returned by ResolveProxy.
     21 class NET_EXPORT ProxyInfo {
     22  public:
     23   ProxyInfo();
     24   ~ProxyInfo();
     25   // Default copy-constructor and assignment operator are OK!
     26 
     27   // Uses the same proxy server as the given |proxy_info|.
     28   void Use(const ProxyInfo& proxy_info);
     29 
     30   // Uses a direct connection.
     31   void UseDirect();
     32 
     33   // Uses a direct connection. did_bypass_proxy() will return true to indicate
     34   // that the direct connection is the result of configured proxy bypass rules.
     35   void UseDirectWithBypassedProxy();
     36 
     37   // Uses a specific proxy server, of the form:
     38   //   proxy-uri = [<scheme> "://"] <hostname> [":" <port>]
     39   // This may optionally be a semi-colon delimited list of <proxy-uri>.
     40   // It is OK to have LWS between entries.
     41   void UseNamedProxy(const std::string& proxy_uri_list);
     42 
     43   // Sets the proxy list to a single entry, |proxy_server|.
     44   void UseProxyServer(const ProxyServer& proxy_server);
     45 
     46   // Parses from the given PAC result.
     47   void UsePacString(const std::string& pac_string);
     48 
     49   // Use the proxies from the given list.
     50   void UseProxyList(const ProxyList& proxy_list);
     51 
     52   // Returns true if this proxy info specifies a direct connection.
     53   bool is_direct() const {
     54     // We don't implicitly fallback to DIRECT unless it was added to the list.
     55     if (is_empty())
     56       return false;
     57     return proxy_list_.Get().is_direct();
     58   }
     59 
     60   bool is_direct_only() const {
     61     return is_direct() && proxy_list_.size() == 1 && proxy_retry_info_.empty();
     62   }
     63 
     64   // Returns true if the first valid proxy server is an https proxy.
     65   bool is_https() const {
     66     if (is_empty())
     67       return false;
     68     return proxy_server().is_https();
     69   }
     70 
     71   // Returns true if the first valid proxy server is an http proxy.
     72   bool is_http() const {
     73     if (is_empty())
     74       return false;
     75     return proxy_server().is_http();
     76   }
     77 
     78   // Returns true if the first valid proxy server is a socks server.
     79   bool is_socks() const {
     80     if (is_empty())
     81       return false;
     82     return proxy_server().is_socks();
     83   }
     84 
     85   // Returns true if this proxy info has no proxies left to try.
     86   bool is_empty() const {
     87     return proxy_list_.IsEmpty();
     88   }
     89 
     90   // Returns true if this proxy resolution is using a direct connection due to
     91   // proxy bypass rules.
     92   bool did_bypass_proxy() const {
     93     return did_bypass_proxy_;
     94   }
     95 
     96   // Returns true if the proxy resolution was done using a PAC script.
     97   bool did_use_pac_script() const {
     98     return did_use_pac_script_;
     99   }
    100 
    101   // Returns the first valid proxy server. is_empty() must be false to be able
    102   // to call this function.
    103   const ProxyServer& proxy_server() const { return proxy_list_.Get(); }
    104 
    105   // Returns the source for configuration settings used for proxy resolution.
    106   ProxyConfigSource config_source() const { return config_source_; }
    107 
    108   // See description in ProxyList::ToPacString().
    109   std::string ToPacString() const;
    110 
    111   // Marks the current proxy as bad. Returns true if there is another proxy
    112   // available to try in proxy list_.
    113   bool Fallback(const BoundNetLog& net_log);
    114 
    115   // De-prioritizes the proxies that we have cached as not working, by moving
    116   // them to the end of the proxy list.
    117   void DeprioritizeBadProxies(const ProxyRetryInfoMap& proxy_retry_info);
    118 
    119   // Deletes any entry which doesn't have one of the specified proxy schemes.
    120   void RemoveProxiesWithoutScheme(int scheme_bit_field);
    121 
    122   ProxyConfig::ID config_id() const { return config_id_; }
    123 
    124   base::TimeTicks proxy_resolve_start_time() const {
    125     return proxy_resolve_start_time_;
    126   }
    127 
    128   base::TimeTicks proxy_resolve_end_time() const {
    129     return proxy_resolve_end_time_;
    130   }
    131 
    132  private:
    133   friend class ProxyService;
    134 
    135   const ProxyRetryInfoMap& proxy_retry_info() const {
    136     return proxy_retry_info_;
    137   }
    138 
    139   // Reset proxy and config settings.
    140   void Reset();
    141 
    142   // The ordered list of proxy servers (including DIRECT attempts) remaining to
    143   // try. If proxy_list_ is empty, then there is nothing left to fall back to.
    144   ProxyList proxy_list_;
    145 
    146   // List of proxies that have been tried already.
    147   ProxyRetryInfoMap proxy_retry_info_;
    148 
    149   // This value identifies the proxy config used to initialize this object.
    150   ProxyConfig::ID config_id_;
    151 
    152   // The source of the proxy settings used,
    153   ProxyConfigSource config_source_;
    154 
    155   // Whether the proxy result represent a proxy bypass.
    156   bool did_bypass_proxy_;
    157 
    158   // Whether we used a PAC script for resolving the proxy.
    159   bool did_use_pac_script_;
    160 
    161   // How long it took to resolve the proxy.  Times are both null if proxy was
    162   // determined synchronously without running a PAC.
    163   base::TimeTicks proxy_resolve_start_time_;
    164   base::TimeTicks proxy_resolve_end_time_;
    165 };
    166 
    167 }  // namespace net
    168 
    169 #endif  // NET_PROXY_PROXY_INFO_H_
    170