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