Home | History | Annotate | Download | only in url_request
      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 // 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 
     13 #include <set>
     14 #include <string>
     15 
     16 #include "base/memory/ref_counted.h"
     17 #include "base/memory/scoped_ptr.h"
     18 #include "base/memory/weak_ptr.h"
     19 #include "base/threading/non_thread_safe.h"
     20 #include "net/base/net_export.h"
     21 #include "net/base/net_log.h"
     22 #include "net/base/request_priority.h"
     23 #include "net/http/http_network_session.h"
     24 #include "net/http/http_server_properties.h"
     25 #include "net/http/transport_security_state.h"
     26 #include "net/ssl/ssl_config_service.h"
     27 #include "net/url_request/url_request.h"
     28 
     29 namespace net {
     30 class CertVerifier;
     31 class ChannelIDService;
     32 class CookieStore;
     33 class CTVerifier;
     34 class FraudulentCertificateReporter;
     35 class HostResolver;
     36 class HttpAuthHandlerFactory;
     37 class HttpTransactionFactory;
     38 class HttpUserAgentSettings;
     39 class NetworkDelegate;
     40 class SdchManager;
     41 class ProxyService;
     42 class URLRequest;
     43 class URLRequestJobFactory;
     44 class URLRequestThrottlerManager;
     45 
     46 // Subclass to provide application-specific context for URLRequest
     47 // instances. Note that URLRequestContext typically does not provide storage for
     48 // these member variables, since they may be shared. For the ones that aren't
     49 // shared, URLRequestContextStorage can be helpful in defining their storage.
     50 class NET_EXPORT URLRequestContext
     51     : NON_EXPORTED_BASE(public base::NonThreadSafe) {
     52  public:
     53   URLRequestContext();
     54   virtual ~URLRequestContext();
     55 
     56   // Copies the state from |other| into this context.
     57   void CopyFrom(const URLRequestContext* other);
     58 
     59   // May return NULL if this context doesn't have an associated network session.
     60   const HttpNetworkSession::Params* GetNetworkSessionParams() const;
     61 
     62   // Creates a URLRequest. If |cookie_store| is non-NULL, it will be used
     63   // instead of the context's cookie store.
     64   scoped_ptr<URLRequest> CreateRequest(const GURL& url,
     65                                        RequestPriority priority,
     66                                        URLRequest::Delegate* delegate,
     67                                        CookieStore* cookie_store) const;
     68 
     69   NetLog* net_log() const {
     70     return net_log_;
     71   }
     72 
     73   void set_net_log(NetLog* net_log) {
     74     net_log_ = net_log;
     75   }
     76 
     77   HostResolver* host_resolver() const {
     78     return host_resolver_;
     79   }
     80 
     81   void set_host_resolver(HostResolver* host_resolver) {
     82     host_resolver_ = host_resolver;
     83   }
     84 
     85   CertVerifier* cert_verifier() const {
     86     return cert_verifier_;
     87   }
     88 
     89   void set_cert_verifier(CertVerifier* cert_verifier) {
     90     cert_verifier_ = cert_verifier;
     91   }
     92 
     93   ChannelIDService* channel_id_service() const {
     94     return channel_id_service_;
     95   }
     96 
     97   void set_channel_id_service(
     98       ChannelIDService* channel_id_service) {
     99     channel_id_service_ = channel_id_service;
    100   }
    101 
    102   FraudulentCertificateReporter* fraudulent_certificate_reporter() const {
    103     return fraudulent_certificate_reporter_;
    104   }
    105   void set_fraudulent_certificate_reporter(
    106       FraudulentCertificateReporter* fraudulent_certificate_reporter) {
    107     fraudulent_certificate_reporter_ = fraudulent_certificate_reporter;
    108   }
    109 
    110   // Get the proxy service for this context.
    111   ProxyService* proxy_service() const { return proxy_service_; }
    112   void set_proxy_service(ProxyService* proxy_service) {
    113     proxy_service_ = proxy_service;
    114   }
    115 
    116   // Get the ssl config service for this context.
    117   SSLConfigService* ssl_config_service() const {
    118     return ssl_config_service_.get();
    119   }
    120   void set_ssl_config_service(SSLConfigService* service) {
    121     ssl_config_service_ = service;
    122   }
    123 
    124   // Gets the HTTP Authentication Handler Factory for this context.
    125   // The factory is only valid for the lifetime of this URLRequestContext
    126   HttpAuthHandlerFactory* http_auth_handler_factory() const {
    127     return http_auth_handler_factory_;
    128   }
    129   void set_http_auth_handler_factory(HttpAuthHandlerFactory* factory) {
    130     http_auth_handler_factory_ = factory;
    131   }
    132 
    133   // Gets the http transaction factory for this context.
    134   HttpTransactionFactory* http_transaction_factory() const {
    135     return http_transaction_factory_;
    136   }
    137   void set_http_transaction_factory(HttpTransactionFactory* factory) {
    138     http_transaction_factory_ = factory;
    139   }
    140 
    141   void set_network_delegate(NetworkDelegate* network_delegate) {
    142     network_delegate_ = network_delegate;
    143   }
    144   NetworkDelegate* network_delegate() const { return network_delegate_; }
    145 
    146   void set_http_server_properties(
    147       const base::WeakPtr<HttpServerProperties>& http_server_properties) {
    148     http_server_properties_ = http_server_properties;
    149   }
    150   base::WeakPtr<HttpServerProperties> http_server_properties() const {
    151     return http_server_properties_;
    152   }
    153 
    154   // Gets the cookie store for this context (may be null, in which case
    155   // cookies are not stored).
    156   CookieStore* cookie_store() const { return cookie_store_.get(); }
    157   void set_cookie_store(CookieStore* cookie_store);
    158 
    159   TransportSecurityState* transport_security_state() const {
    160     return transport_security_state_;
    161   }
    162   void set_transport_security_state(
    163       TransportSecurityState* state) {
    164     transport_security_state_ = state;
    165   }
    166 
    167   CTVerifier* cert_transparency_verifier() const {
    168     return cert_transparency_verifier_;
    169   }
    170   void set_cert_transparency_verifier(CTVerifier* verifier) {
    171     cert_transparency_verifier_ = verifier;
    172   }
    173 
    174   const URLRequestJobFactory* job_factory() const { return job_factory_; }
    175   void set_job_factory(const URLRequestJobFactory* job_factory) {
    176     job_factory_ = job_factory;
    177   }
    178 
    179   // May be NULL.
    180   URLRequestThrottlerManager* throttler_manager() const {
    181     return throttler_manager_;
    182   }
    183   void set_throttler_manager(URLRequestThrottlerManager* throttler_manager) {
    184     throttler_manager_ = throttler_manager;
    185   }
    186 
    187   // May be NULL.
    188   SdchManager* sdch_manager() const {
    189     return sdch_manager_;
    190   }
    191   void set_sdch_manager(SdchManager* sdch_manager) {
    192     sdch_manager_ = sdch_manager;
    193   }
    194 
    195   // Gets the URLRequest objects that hold a reference to this
    196   // URLRequestContext.
    197   std::set<const URLRequest*>* url_requests() const {
    198     return url_requests_.get();
    199   }
    200 
    201   // CHECKs that no URLRequests using this context remain. Subclasses should
    202   // additionally call AssertNoURLRequests() within their own destructor,
    203   // prior to implicit destruction of subclass-owned state.
    204   void AssertNoURLRequests() const;
    205 
    206   // Get the underlying |HttpUserAgentSettings| implementation that provides
    207   // the HTTP Accept-Language and User-Agent header values.
    208   const HttpUserAgentSettings* http_user_agent_settings() const {
    209     return http_user_agent_settings_;
    210   }
    211   void set_http_user_agent_settings(
    212       HttpUserAgentSettings* http_user_agent_settings) {
    213     http_user_agent_settings_ = http_user_agent_settings;
    214   }
    215 
    216  private:
    217   // ---------------------------------------------------------------------------
    218   // Important: When adding any new members below, consider whether they need to
    219   // be added to CopyFrom.
    220   // ---------------------------------------------------------------------------
    221 
    222   // Ownership for these members are not defined here. Clients should either
    223   // provide storage elsewhere or have a subclass take ownership.
    224   NetLog* net_log_;
    225   HostResolver* host_resolver_;
    226   CertVerifier* cert_verifier_;
    227   ChannelIDService* channel_id_service_;
    228   FraudulentCertificateReporter* fraudulent_certificate_reporter_;
    229   HttpAuthHandlerFactory* http_auth_handler_factory_;
    230   ProxyService* proxy_service_;
    231   scoped_refptr<SSLConfigService> ssl_config_service_;
    232   NetworkDelegate* network_delegate_;
    233   base::WeakPtr<HttpServerProperties> http_server_properties_;
    234   HttpUserAgentSettings* http_user_agent_settings_;
    235   scoped_refptr<CookieStore> cookie_store_;
    236   TransportSecurityState* transport_security_state_;
    237   CTVerifier* cert_transparency_verifier_;
    238   HttpTransactionFactory* http_transaction_factory_;
    239   const URLRequestJobFactory* job_factory_;
    240   URLRequestThrottlerManager* throttler_manager_;
    241   SdchManager* sdch_manager_;
    242 
    243   // ---------------------------------------------------------------------------
    244   // Important: When adding any new members below, consider whether they need to
    245   // be added to CopyFrom.
    246   // ---------------------------------------------------------------------------
    247 
    248   scoped_ptr<std::set<const URLRequest*> > url_requests_;
    249 
    250   DISALLOW_COPY_AND_ASSIGN(URLRequestContext);
    251 };
    252 
    253 }  // namespace net
    254 
    255 #endif  // NET_URL_REQUEST_URL_REQUEST_CONTEXT_H_
    256