Home | History | Annotate | Download | only in url_request
      1 // Copyright (c) 2011 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 // This class represents contextual information (cookies, cache, etc.)
      6 // that's useful when processing resource requests.
      7 // The class is reference-counted so that it can be cleaned up after any
      8 // requests that are using it have been completed.
      9 
     10 #ifndef NET_URL_REQUEST_URL_REQUEST_CONTEXT_H_
     11 #define NET_URL_REQUEST_URL_REQUEST_CONTEXT_H_
     12 #pragma once
     13 
     14 #include "base/memory/ref_counted.h"
     15 #include "base/threading/non_thread_safe.h"
     16 #include "net/base/net_export.h"
     17 #include "net/base/net_log.h"
     18 #include "net/base/ssl_config_service.h"
     19 #include "net/base/transport_security_state.h"
     20 #include "net/ftp/ftp_auth_cache.h"
     21 #include "net/proxy/proxy_service.h"
     22 #include "net/socket/dns_cert_provenance_checker.h"
     23 
     24 namespace net {
     25 class CertVerifier;
     26 class CookiePolicy;
     27 class CookieStore;
     28 class DnsCertProvenanceChecker;
     29 class DnsRRResolver;
     30 class FtpTransactionFactory;
     31 class HostResolver;
     32 class HttpAuthHandlerFactory;
     33 class HttpTransactionFactory;
     34 class NetworkDelegate;
     35 class SSLConfigService;
     36 class URLRequest;
     37 
     38 // Subclass to provide application-specific context for URLRequest
     39 // instances. Note that URLRequestContext typically does not provide storage for
     40 // these member variables, since they may be shared. For the ones that aren't
     41 // shared, URLRequestContextStorage can be helpful in defining their storage.
     42 class NET_EXPORT URLRequestContext
     43     : public base::RefCountedThreadSafe<URLRequestContext>,
     44       public base::NonThreadSafe {
     45  public:
     46   URLRequestContext();
     47 
     48   // Copies the state from |other| into this context.
     49   void CopyFrom(URLRequestContext* other);
     50 
     51   NetLog* net_log() const {
     52     return net_log_;
     53   }
     54 
     55   void set_net_log(NetLog* net_log) {
     56     net_log_ = net_log;
     57   }
     58 
     59   HostResolver* host_resolver() const {
     60     return host_resolver_;
     61   }
     62 
     63   void set_host_resolver(HostResolver* host_resolver) {
     64     host_resolver_ = host_resolver;
     65   }
     66 
     67   CertVerifier* cert_verifier() const {
     68     return cert_verifier_;
     69   }
     70 
     71   void set_cert_verifier(CertVerifier* cert_verifier) {
     72     cert_verifier_ = cert_verifier;
     73   }
     74 
     75   DnsRRResolver* dnsrr_resolver() const {
     76     return dnsrr_resolver_;
     77   }
     78 
     79   void set_dnsrr_resolver(DnsRRResolver* dnsrr_resolver) {
     80     dnsrr_resolver_ = dnsrr_resolver;
     81   }
     82 
     83   DnsCertProvenanceChecker* dns_cert_checker() const {
     84     return dns_cert_checker_;
     85   }
     86   void set_dns_cert_checker(DnsCertProvenanceChecker* dns_cert_checker) {
     87     dns_cert_checker_ = dns_cert_checker;
     88   }
     89 
     90   // Get the proxy service for this context.
     91   ProxyService* proxy_service() const { return proxy_service_; }
     92   void set_proxy_service(ProxyService* proxy_service) {
     93     proxy_service_ = proxy_service;
     94   }
     95 
     96   // Get the ssl config service for this context.
     97   SSLConfigService* ssl_config_service() const { return ssl_config_service_; }
     98   void set_ssl_config_service(SSLConfigService* service) {
     99     ssl_config_service_ = service;
    100   }
    101 
    102   // Gets the HTTP Authentication Handler Factory for this context.
    103   // The factory is only valid for the lifetime of this URLRequestContext
    104   HttpAuthHandlerFactory* http_auth_handler_factory() {
    105     return http_auth_handler_factory_;
    106   }
    107   void set_http_auth_handler_factory(HttpAuthHandlerFactory* factory) {
    108     http_auth_handler_factory_ = factory;
    109   }
    110 
    111   // Gets the http transaction factory for this context.
    112   HttpTransactionFactory* http_transaction_factory() const {
    113     return http_transaction_factory_;
    114   }
    115   void set_http_transaction_factory(HttpTransactionFactory* factory) {
    116     http_transaction_factory_ = factory;
    117   }
    118 
    119   // Gets the ftp transaction factory for this context.
    120   FtpTransactionFactory* ftp_transaction_factory() {
    121     return ftp_transaction_factory_;
    122   }
    123   void set_ftp_transaction_factory(FtpTransactionFactory* factory) {
    124     ftp_transaction_factory_ = factory;
    125   }
    126 
    127   void set_network_delegate(NetworkDelegate* network_delegate) {
    128     network_delegate_ = network_delegate;
    129   }
    130   NetworkDelegate* network_delegate() const { return network_delegate_; }
    131 
    132   // Gets the cookie store for this context (may be null, in which case
    133   // cookies are not stored).
    134   CookieStore* cookie_store() const { return cookie_store_.get(); }
    135   void set_cookie_store(CookieStore* cookie_store);
    136 
    137   // Gets the cookie policy for this context (may be null, in which case
    138   // cookies are allowed).
    139   CookiePolicy* cookie_policy() const { return cookie_policy_; }
    140   void set_cookie_policy(CookiePolicy* cookie_policy) {
    141     cookie_policy_ = cookie_policy;
    142   }
    143 
    144   TransportSecurityState* transport_security_state() const {
    145       return transport_security_state_;
    146   }
    147   void set_transport_security_state(
    148       TransportSecurityState* state) {
    149     transport_security_state_ = state;
    150   }
    151 
    152   // Gets the FTP authentication cache for this context.
    153   FtpAuthCache* ftp_auth_cache() { return &ftp_auth_cache_; }
    154 
    155   // Gets the value of 'Accept-Charset' header field.
    156   const std::string& accept_charset() const { return accept_charset_; }
    157   void set_accept_charset(const std::string& accept_charset) {
    158     accept_charset_ = accept_charset;
    159   }
    160 
    161   // Gets the value of 'Accept-Language' header field.
    162 #ifdef ANDROID
    163   virtual
    164 #endif
    165   const std::string& accept_language() const { return accept_language_; }
    166 
    167   void set_accept_language(const std::string& accept_language) {
    168     accept_language_ = accept_language;
    169   }
    170 
    171   // Gets the UA string to use for the given URL.  Pass an invalid URL (such as
    172   // GURL()) to get the default UA string.  Subclasses should override this
    173   // method to provide a UA string.
    174   virtual const std::string& GetUserAgent(const GURL& url) const;
    175 
    176   // In general, referrer_charset is not known when URLRequestContext is
    177   // constructed. So, we need a setter.
    178   const std::string& referrer_charset() const { return referrer_charset_; }
    179   void set_referrer_charset(const std::string& charset) {
    180     referrer_charset_ = charset;
    181   }
    182 
    183   // Controls whether or not the URLRequestContext considers itself to be the
    184   // "main" URLRequestContext.
    185   bool is_main() const { return is_main_; }
    186   void set_is_main(bool is_main) { is_main_ = is_main; }
    187 
    188   // Is SNI available in this request context?
    189   bool IsSNIAvailable() const;
    190 
    191 #ifdef ANDROID
    192   // Gets the UID of the calling process
    193   bool getUID(uid_t *uid) const;
    194   void setUID(uid_t uid);
    195 #endif
    196 
    197  protected:
    198   friend class base::RefCountedThreadSafe<URLRequestContext>;
    199 
    200   virtual ~URLRequestContext();
    201 
    202  private:
    203   // ---------------------------------------------------------------------------
    204   // Important: When adding any new members below, consider whether they need to
    205   // be added to CopyFrom.
    206   // ---------------------------------------------------------------------------
    207 
    208   // Indicates whether or not this is the main URLRequestContext.
    209   bool is_main_;
    210 
    211   // Ownership for these members are not defined here. Clients should either
    212   // provide storage elsewhere or have a subclass take ownership.
    213   NetLog* net_log_;
    214   HostResolver* host_resolver_;
    215   CertVerifier* cert_verifier_;
    216   DnsRRResolver* dnsrr_resolver_;
    217   DnsCertProvenanceChecker* dns_cert_checker_;
    218   HttpAuthHandlerFactory* http_auth_handler_factory_;
    219   scoped_refptr<ProxyService> proxy_service_;
    220   scoped_refptr<SSLConfigService> ssl_config_service_;
    221   NetworkDelegate* network_delegate_;
    222   scoped_refptr<CookieStore> cookie_store_;
    223   CookiePolicy* cookie_policy_;
    224   scoped_refptr<TransportSecurityState> transport_security_state_;
    225   FtpAuthCache ftp_auth_cache_;
    226   std::string accept_language_;
    227   std::string accept_charset_;
    228   // The charset of the referrer where this request comes from. It's not
    229   // used in communication with a server but is used to construct a suggested
    230   // filename for file download.
    231   std::string referrer_charset_;
    232 
    233   HttpTransactionFactory* http_transaction_factory_;
    234   FtpTransactionFactory* ftp_transaction_factory_;
    235 
    236   // ---------------------------------------------------------------------------
    237   // Important: When adding any new members below, consider whether they need to
    238   // be added to CopyFrom.
    239   // ---------------------------------------------------------------------------
    240 
    241 #ifdef ANDROID
    242   bool valid_uid_;
    243   uid_t calling_uid_;
    244 #endif
    245 
    246   DISALLOW_COPY_AND_ASSIGN(URLRequestContext);
    247 };
    248 
    249 }  // namespace net
    250 
    251 #endif  // NET_URL_REQUEST_URL_REQUEST_CONTEXT_H_
    252