blob: 9da6d7ebd66fb51fde330be871db882bae600058 [file] [log] [blame]
[email protected]9c4eff22012-03-20 22:42:291// Copyright (c) 2012 The Chromium Authors. All rights reserved.
license.botbf09a502008-08-24 00:55:552// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
initial.commit586acc5fe2008-07-26 22:42:524
5// This class represents contextual information (cookies, cache, etc.)
ricea29e27d12016-08-10 02:09:186// that's necessary when processing resource requests.
initial.commit586acc5fe2008-07-26 22:42:527
[email protected]43530b32008-08-04 22:21:348#ifndef NET_URL_REQUEST_URL_REQUEST_CONTEXT_H_
9#define NET_URL_REQUEST_URL_REQUEST_CONTEXT_H_
initial.commit586acc5fe2008-07-26 22:42:5210
ainozakib2207272021-09-17 01:30:3511#include <stdint.h>
danakj8522a25b2016-04-16 00:17:3612#include <memory>
[email protected]7c52ed92012-04-06 15:42:4013#include <set>
[email protected]ee4c30d2012-11-07 15:08:4314#include <string>
[email protected]7c52ed92012-04-06 15:42:4015
Keishi Hattori0e45c022021-11-27 09:25:5216#include "base/memory/raw_ptr.h"
[email protected]3b63f8f42011-03-28 01:54:1517#include "base/memory/ref_counted.h"
[email protected]18590f22011-07-29 16:41:2818#include "base/memory/weak_ptr.h"
gab47aa7da2017-06-02 16:09:4319#include "base/threading/thread_checker.h"
Yutaka Hirano53c9e852022-03-29 18:13:3120#include "base/types/pass_key.h"
Nicolas Ouellet-Payeur6e833b52019-07-02 17:18:0821#include "build/build_config.h"
Yuta Hijikata101ed2a2020-11-18 07:50:3922#include "build/chromeos_buildflags.h"
[email protected]172da1b2011-08-12 15:52:2623#include "net/base/net_export.h"
Stefano Duo44af16c2022-02-10 15:23:1124#include "net/base/network_change_notifier.h"
[email protected]2ca01e52013-10-31 22:05:1925#include "net/base/request_priority.h"
ainozaki7eefe912021-10-12 03:40:2626#include "net/log/net_log_source.h"
Scott Violet0caaaf432018-03-24 00:43:5927#include "net/net_buildflags.h"
rhalavatia9b551d2017-02-09 12:03:0028#include "net/traffic_annotation/network_traffic_annotation.h"
[email protected]8a26ff62012-08-24 21:49:2029#include "net/url_request/url_request.h"
ainozakib2207272021-09-17 01:30:3530#include "third_party/abseil-cpp/absl/types/optional.h"
initial.commit586acc5fe2008-07-26 22:42:5231
[email protected]8ac1a752008-07-31 19:40:3732namespace net {
[email protected]822581d2010-12-16 17:27:1533class CertVerifier;
[email protected]9349cfb2010-08-31 18:00:5334class CookieStore;
rsleevid6de8302016-06-21 01:33:2035class CTPolicyEnforcer;
[email protected]9349cfb2010-08-31 18:00:5336class HostResolver;
[email protected]fa55e192010-02-15 14:25:5037class HttpAuthHandlerFactory;
Matt Menke30a878c2021-07-20 22:25:0938struct HttpNetworkSessionContext;
39struct HttpNetworkSessionParams;
Matt Menkece5d765372021-08-17 18:24:1240class HttpServerProperties;
[email protected]b65ce0942009-03-16 20:13:3341class HttpTransactionFactory;
[email protected]ee4c30d2012-11-07 15:08:4342class HttpUserAgentSettings;
mikecironef22f9812016-10-04 03:40:1943class NetLog;
[email protected]0651b812011-02-24 00:22:5044class NetworkDelegate;
Yutaka Hirano11a98342022-03-29 16:26:2845class NetworkErrorLoggingService;
tbansalea2fb8c2015-05-22 22:23:0046class NetworkQualityEstimator;
Wojciech Dzierżanowski1f823562019-01-18 11:26:0047class ProxyDelegate;
Nicolas Arciniega8ec5bfa2020-03-20 05:07:2648class ProxyResolutionService;
Victor Vasiliev7752898d2019-11-14 21:30:2249class QuicContext;
Yutaka Hirano11a98342022-03-29 16:26:2850class ReportingService;
Chris Thompsonf31b2492020-07-21 05:47:4251class SCTAuditingDelegate;
Ryan Sleevib8449e02018-07-15 04:31:0752class SSLConfigService;
Matt Menkece5d765372021-08-17 18:24:1253class TransportSecurityState;
[email protected]eaadd9052009-06-23 18:02:2354class URLRequest;
[email protected]a8c1e7452011-05-14 06:17:0755class URLRequestJobFactory;
[email protected]a73a2802012-05-02 19:20:1556class URLRequestThrottlerManager;
Yutaka Hirano11a98342022-03-29 16:26:2857class URLRequestContextStorage;
58class URLRequestContextBuilder;
initial.commit586acc5fe2008-07-26 22:42:5259
Julia Tuttle3f9acac2017-11-20 22:06:3060#if BUILDFLAG(ENABLE_REPORTING)
Julia Tuttlecba7d222018-02-23 19:37:2761class NetworkErrorLoggingService;
Julia Tuttle3f9acac2017-11-20 22:06:3062class ReportingService;
63#endif // BUILDFLAG(ENABLE_REPORTING)
64
[email protected]27a112c2011-01-06 04:19:3065// Subclass to provide application-specific context for URLRequest
ricea29e27d12016-08-10 02:09:1866// instances. URLRequestContext does not own these member variables, since they
67// may be shared with other contexts. URLRequestContextStorage can be used for
68// automatic lifetime management. Most callers should use an existing
69// URLRequestContext rather than creating a new one, as guaranteeing that the
70// URLRequestContext is destroyed before its members can be difficult.
Kenichi Ishibashia92b9652021-09-10 23:43:4471class NET_EXPORT URLRequestContext {
initial.commit586acc5fe2008-07-26 22:42:5272 public:
Yutaka Hirano53c9e852022-03-29 18:13:3173 // URLRequestContext must be created by URLRequestContextBuilder.
74 explicit URLRequestContext(base::PassKey<URLRequestContextBuilder> pass_key);
Peter Boström293b1342021-09-22 17:31:4375
76 URLRequestContext(const URLRequestContext&) = delete;
77 URLRequestContext& operator=(const URLRequestContext&) = delete;
78
Kenichi Ishibashia92b9652021-09-10 23:43:4479 virtual ~URLRequestContext();
[email protected]18590f22011-07-29 16:41:2880
tbansalea2fb8c2015-05-22 22:23:0081 // May return nullptr if this context doesn't have an associated network
82 // session.
Matt Menke30a878c2021-07-20 22:25:0983 const HttpNetworkSessionParams* GetNetworkSessionParams() const;
[email protected]c2dad292012-09-07 21:27:3584
mmenke6ddfbea2017-05-31 21:48:4185 // May return nullptr if this context doesn't have an associated network
86 // session.
Matt Menke30a878c2021-07-20 22:25:0987 const HttpNetworkSessionContext* GetNetworkSessionContext() const;
mmenke6ddfbea2017-05-31 21:48:4188
Yuta Hijikata101ed2a2020-11-18 07:50:3989// TODO(crbug.com/1052397): Revisit once build flag switch of lacros-chrome is
90// complete.
Xiaohan Wang2a6845b2022-01-08 04:40:5791#if !BUILDFLAG(IS_WIN) && \
92 !(BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
rhalavatia9b551d2017-02-09 12:03:0093 // This function should not be used in Chromium, please use the version with
94 // NetworkTrafficAnnotationTag in the future.
Nicolas Ouellet-Payeur6e833b52019-07-02 17:18:0895 //
96 // The unannotated method is not available on desktop Linux + Windows. It's
97 // available on other platforms, since we only audit network annotations on
98 // Linux & Windows.
danakj8522a25b2016-04-16 00:17:3699 std::unique_ptr<URLRequest> CreateRequest(
100 const GURL& url,
101 RequestPriority priority,
102 URLRequest::Delegate* delegate) const;
Nicolas Ouellet-Payeur6e833b52019-07-02 17:18:08103#endif
[email protected]8a26ff62012-08-24 21:49:20104
Matt Menkefe9a9df2021-09-08 17:55:24105 // `traffic_annotation` is metadata about the network traffic send via this
rhalavatia9b551d2017-02-09 12:03:00106 // URLRequest, see net::DefineNetworkTrafficAnnotation. Note that:
107 // - net provides the API for tagging requests with an opaque identifier.
Nicolas Ouellet-Payeur326a2692021-07-15 01:17:33108 // - chrome/browser/privacy/traffic_annotation.proto contains the Chrome
rhalavatia9b551d2017-02-09 12:03:00109 // specific .proto describing the verbose annotation format that Chrome's
110 // callsites are expected to follow.
111 // - tools/traffic_annotation/ contains sample and template for annotation and
112 // tools will be added for verification following crbug.com/690323.
Matt Menkefe9a9df2021-09-08 17:55:24113 //
114 // `is_for_websockets` should be true iff this was created for use by a
115 // websocket. HTTP/HTTPS requests fail if it's true, and WS/WSS requests fail
116 // if it's false. This is to protect against broken consumers.
ainozakib2207272021-09-17 01:30:35117 //
118 // `net_log_source_id` is used to construct NetLogWithSource using the
119 // specified Source ID. This method is expected to be used when URLRequest
120 // wants to take over existing NetLogSource.
rhalavatia9b551d2017-02-09 12:03:00121 std::unique_ptr<URLRequest> CreateRequest(
122 const GURL& url,
123 RequestPriority priority,
124 URLRequest::Delegate* delegate,
Matt Menkefe9a9df2021-09-08 17:55:24125 NetworkTrafficAnnotationTag traffic_annotation,
ainozakib2207272021-09-17 01:30:35126 bool is_for_websockets = false,
ainozaki7eefe912021-10-12 03:40:26127 const absl::optional<net::NetLogSource> net_log_source =
128 absl::nullopt) const;
rhalavatia9b551d2017-02-09 12:03:00129
130 NetLog* net_log() const { return net_log_; }
[email protected]9e743cd2010-03-16 07:03:53131
[email protected]27a112c2011-01-06 04:19:30132 HostResolver* host_resolver() const {
[email protected]8a00f00a2009-06-12 00:49:38133 return host_resolver_;
134 }
135
[email protected]27a112c2011-01-06 04:19:30136 CertVerifier* cert_verifier() const {
[email protected]822581d2010-12-16 17:27:15137 return cert_verifier_;
138 }
139
[email protected]63de95b2008-12-10 04:11:27140 // Get the proxy service for this context.
Nicolas Arciniega8ec5bfa2020-03-20 05:07:26141 ProxyResolutionService* proxy_resolution_service() const {
Lily Houghton8c2f97d2018-01-22 05:06:59142 return proxy_resolution_service_;
143 }
[email protected]2fb629202010-12-23 23:52:57144
Wojciech Dzierżanowski1f823562019-01-18 11:26:00145 ProxyDelegate* proxy_delegate() const { return proxy_delegate_; }
Wojciech Dzierżanowski1f823562019-01-18 11:26:00146
[email protected]db36938c2009-08-19 21:48:42147 // Get the ssl config service for this context.
Ryan Sleevib8449e02018-07-15 04:31:07148 SSLConfigService* ssl_config_service() const { return ssl_config_service_; }
[email protected]db36938c2009-08-19 21:48:42149
[email protected]2fb629202010-12-23 23:52:57150 // Gets the HTTP Authentication Handler Factory for this context.
151 // The factory is only valid for the lifetime of this URLRequestContext
[email protected]ef2bf422012-05-11 03:27:09152 HttpAuthHandlerFactory* http_auth_handler_factory() const {
[email protected]2fb629202010-12-23 23:52:57153 return http_auth_handler_factory_;
154 }
[email protected]2fb629202010-12-23 23:52:57155
initial.commit586acc5fe2008-07-26 22:42:52156 // Gets the http transaction factory for this context.
[email protected]27a112c2011-01-06 04:19:30157 HttpTransactionFactory* http_transaction_factory() const {
[email protected]db8f44c2008-12-13 04:52:01158 return http_transaction_factory_;
initial.commit586acc5fe2008-07-26 22:42:52159 }
[email protected]2fb629202010-12-23 23:52:57160
[email protected]0651b812011-02-24 00:22:50161 NetworkDelegate* network_delegate() const { return network_delegate_; }
[email protected]d05ef99c2011-02-01 21:38:16162
bnc525e175a2016-06-20 12:36:40163 HttpServerProperties* http_server_properties() const {
[email protected]db96a882011-10-09 02:01:54164 return http_server_properties_;
165 }
166
[email protected]be6fca6c2010-01-30 21:48:57167 // Gets the cookie store for this context (may be null, in which case
168 // cookies are not stored).
mmenke606c59c2016-03-07 18:20:55169 CookieStore* cookie_store() const { return cookie_store_; }
[email protected]2fb629202010-12-23 23:52:57170
[email protected]f6c21cb2011-02-16 19:45:41171 TransportSecurityState* transport_security_state() const {
[email protected]284303b62013-11-28 15:11:54172 return transport_security_state_;
[email protected]f6c21cb2011-02-16 19:45:41173 }
[email protected]a9cea7542009-05-20 04:30:23174
rsleevid6de8302016-06-21 01:33:20175 CTPolicyEnforcer* ct_policy_enforcer() const { return ct_policy_enforcer_; }
rsleevid6de8302016-06-21 01:33:20176
Chris Thompsonf31b2492020-07-21 05:47:42177 SCTAuditingDelegate* sct_auditing_delegate() const {
178 return sct_auditing_delegate_;
179 }
Chris Thompsonf31b2492020-07-21 05:47:42180
[email protected]a8c1e7452011-05-14 06:17:07181 const URLRequestJobFactory* job_factory() const { return job_factory_; }
[email protected]a8c1e7452011-05-14 06:17:07182
tbansalea2fb8c2015-05-22 22:23:00183 // May return nullptr.
[email protected]a73a2802012-05-02 19:20:15184 URLRequestThrottlerManager* throttler_manager() const {
185 return throttler_manager_;
186 }
[email protected]a73a2802012-05-02 19:20:15187
Victor Vasiliev7752898d2019-11-14 21:30:22188 QuicContext* quic_context() const { return quic_context_; }
Victor Vasiliev7752898d2019-11-14 21:30:22189
[email protected]7c52ed92012-04-06 15:42:40190 // Gets the URLRequest objects that hold a reference to this
191 // URLRequestContext.
Helen Lif5e4a752018-01-02 16:03:02192 std::set<const URLRequest*>* url_requests() const {
193 return url_requests_.get();
[email protected]7c52ed92012-04-06 15:42:40194 }
195
[email protected]424559492014-07-22 00:27:40196 // CHECKs that no URLRequests using this context remain. Subclasses should
197 // additionally call AssertNoURLRequests() within their own destructor,
198 // prior to implicit destruction of subclass-owned state.
[email protected]1e714bba2012-04-10 17:01:05199 void AssertNoURLRequests() const;
200
[email protected]ee4c30d2012-11-07 15:08:43201 // Get the underlying |HttpUserAgentSettings| implementation that provides
[email protected]84f05432013-03-15 01:00:12202 // the HTTP Accept-Language and User-Agent header values.
[email protected]ee4c30d2012-11-07 15:08:43203 const HttpUserAgentSettings* http_user_agent_settings() const {
204 return http_user_agent_settings_;
205 }
[email protected]ee4c30d2012-11-07 15:08:43206
tbansalea2fb8c2015-05-22 22:23:00207 // Gets the NetworkQualityEstimator associated with this context.
208 // May return nullptr.
209 NetworkQualityEstimator* network_quality_estimator() const {
210 return network_quality_estimator_;
211 }
tbansalea2fb8c2015-05-22 22:23:00212
Julia Tuttle3f9acac2017-11-20 22:06:30213#if BUILDFLAG(ENABLE_REPORTING)
juliatuttle2b8dd2d12017-04-12 21:27:41214 ReportingService* reporting_service() const { return reporting_service_; }
juliatuttle2b8dd2d12017-04-12 21:27:41215
Julia Tuttlecba7d222018-02-23 19:37:27216 NetworkErrorLoggingService* network_error_logging_service() const {
217 return network_error_logging_service_;
Julia Tuttlef9b74062017-07-27 14:44:05218 }
Julia Tuttle3f9acac2017-11-20 22:06:30219#endif // BUILDFLAG(ENABLE_REPORTING)
Julia Tuttlef9b74062017-07-27 14:44:05220
maksim.sisov3d40c812016-05-02 13:27:16221 bool enable_brotli() const { return enable_brotli_; }
222
mgershd21d6d142016-12-14 23:06:36223 // Returns current value of the |check_cleartext_permitted| flag.
224 bool check_cleartext_permitted() const { return check_cleartext_permitted_; }
225
Matt Menkeee10f0412020-05-14 14:16:03226 bool require_network_isolation_key() const {
227 return require_network_isolation_key_;
228 }
229
Stefano Duo44af16c2022-02-10 15:23:11230 // If != NetworkChangeNotifier::kInvalidNetworkHandle, the network which this
231 // context has been bound to.
232 NetworkChangeNotifier::NetworkHandle bound_network() const {
233 return bound_network_;
234 }
Stefano Duo44af16c2022-02-10 15:23:11235
gab47aa7da2017-06-02 16:09:43236 void AssertCalledOnValidThread() {
237 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
238 }
239
Yutaka Hirano11a98342022-03-29 16:26:28240 // DEPRECATED: Do not use this even in tests. This is for a legacy use.
241 void SetJobFactoryForTesting(const URLRequestJobFactory* job_factory) {
242 job_factory_ = job_factory;
243 }
244
[email protected]f6c21cb2011-02-16 19:45:41245 private:
Yutaka Hirano11a98342022-03-29 16:26:28246 friend class URLRequestContextStorage;
247 friend class URLRequestContextBuilder;
248 void set_net_log(NetLog* net_log) { net_log_ = net_log; }
249 void set_host_resolver(HostResolver* host_resolver) {
250 DCHECK(host_resolver);
251 host_resolver_ = host_resolver;
252 }
253 void set_cert_verifier(CertVerifier* cert_verifier) {
254 cert_verifier_ = cert_verifier;
255 }
256 void set_proxy_resolution_service(
257 ProxyResolutionService* proxy_resolution_service) {
258 proxy_resolution_service_ = proxy_resolution_service;
259 }
260 void set_proxy_delegate(ProxyDelegate* proxy_delegate) {
261 proxy_delegate_ = proxy_delegate;
262 }
263 void set_ssl_config_service(SSLConfigService* service) {
264 ssl_config_service_ = service;
265 }
266 void set_http_auth_handler_factory(HttpAuthHandlerFactory* factory) {
267 http_auth_handler_factory_ = factory;
268 }
269 void set_http_transaction_factory(HttpTransactionFactory* factory) {
270 http_transaction_factory_ = factory;
271 }
272 void set_network_delegate(NetworkDelegate* network_delegate) {
273 network_delegate_ = network_delegate;
274 }
275 void set_http_server_properties(
276 HttpServerProperties* http_server_properties) {
277 http_server_properties_ = http_server_properties;
278 }
279 void set_cookie_store(CookieStore* cookie_store);
280 void set_transport_security_state(TransportSecurityState* state) {
281 transport_security_state_ = state;
282 }
283 void set_ct_policy_enforcer(CTPolicyEnforcer* enforcer) {
284 ct_policy_enforcer_ = enforcer;
285 }
286 void set_sct_auditing_delegate(SCTAuditingDelegate* delegate) {
287 sct_auditing_delegate_ = delegate;
288 }
289 void set_job_factory(const URLRequestJobFactory* job_factory) {
290 job_factory_ = job_factory;
291 }
292 void set_throttler_manager(URLRequestThrottlerManager* throttler_manager) {
293 throttler_manager_ = throttler_manager;
294 }
295 void set_quic_context(QuicContext* quic_context) {
296 quic_context_ = quic_context;
297 }
298 void set_http_user_agent_settings(
299 const HttpUserAgentSettings* http_user_agent_settings) {
300 http_user_agent_settings_ = http_user_agent_settings;
301 }
302 void set_network_quality_estimator(
303 NetworkQualityEstimator* network_quality_estimator) {
304 network_quality_estimator_ = network_quality_estimator;
305 }
306#if BUILDFLAG(ENABLE_REPORTING)
307 void set_reporting_service(ReportingService* reporting_service) {
308 reporting_service_ = reporting_service;
309 }
310 void set_network_error_logging_service(
311 NetworkErrorLoggingService* network_error_logging_service) {
312 network_error_logging_service_ = network_error_logging_service;
313 }
314#endif // BUILDFLAG(ENABLE_REPORTING)
315 void set_enable_brotli(bool enable_brotli) { enable_brotli_ = enable_brotli; }
316 void set_check_cleartext_permitted(bool check_cleartext_permitted) {
317 check_cleartext_permitted_ = check_cleartext_permitted;
318 }
319 void set_require_network_isolation_key(bool require_network_isolation_key) {
320 require_network_isolation_key_ = require_network_isolation_key;
321 }
322 void set_bound_network(NetworkChangeNotifier::NetworkHandle network) {
323 bound_network_ = network;
324 }
325
[email protected]f6c21cb2011-02-16 19:45:41326 // Ownership for these members are not defined here. Clients should either
327 // provide storage elsewhere or have a subclass take ownership.
Keishi Hattori0e45c022021-11-27 09:25:52328 raw_ptr<NetLog> net_log_;
329 raw_ptr<HostResolver> host_resolver_;
330 raw_ptr<CertVerifier> cert_verifier_;
331 raw_ptr<HttpAuthHandlerFactory> http_auth_handler_factory_;
332 raw_ptr<ProxyResolutionService> proxy_resolution_service_;
333 raw_ptr<ProxyDelegate> proxy_delegate_;
334 raw_ptr<SSLConfigService> ssl_config_service_;
335 raw_ptr<NetworkDelegate> network_delegate_;
336 raw_ptr<HttpServerProperties> http_server_properties_;
337 raw_ptr<const HttpUserAgentSettings> http_user_agent_settings_;
338 raw_ptr<CookieStore> cookie_store_;
339 raw_ptr<TransportSecurityState> transport_security_state_;
340 raw_ptr<CTPolicyEnforcer> ct_policy_enforcer_;
341 raw_ptr<SCTAuditingDelegate> sct_auditing_delegate_;
342 raw_ptr<HttpTransactionFactory> http_transaction_factory_;
343 raw_ptr<const URLRequestJobFactory> job_factory_;
344 raw_ptr<URLRequestThrottlerManager> throttler_manager_;
345 raw_ptr<QuicContext> quic_context_;
346 raw_ptr<NetworkQualityEstimator> network_quality_estimator_;
Julia Tuttle3f9acac2017-11-20 22:06:30347#if BUILDFLAG(ENABLE_REPORTING)
Keishi Hattori0e45c022021-11-27 09:25:52348 raw_ptr<ReportingService> reporting_service_;
349 raw_ptr<NetworkErrorLoggingService> network_error_logging_service_;
Julia Tuttle3f9acac2017-11-20 22:06:30350#endif // BUILDFLAG(ENABLE_REPORTING)
[email protected]70b92342010-10-12 05:54:06351
Helen Lif5e4a752018-01-02 16:03:02352 std::unique_ptr<std::set<const URLRequest*>> url_requests_;
[email protected]7c52ed92012-04-06 15:42:40353
maksim.sisov3d40c812016-05-02 13:27:16354 // Enables Brotli Content-Encoding support.
Tsuyoshi Horo8e0dfac22022-06-09 01:42:57355 bool enable_brotli_ = false;
mgershd21d6d142016-12-14 23:06:36356 // Enables checking system policy before allowing a cleartext http or ws
357 // request. Only used on Android.
Tsuyoshi Horo8e0dfac22022-06-09 01:42:57358 bool check_cleartext_permitted_ = false;
maksim.sisov3d40c812016-05-02 13:27:16359
Matt Menkeee10f0412020-05-14 14:16:03360 // Triggers a DCHECK if a NetworkIsolationKey/IsolationInfo is not provided to
361 // a request when true.
Tsuyoshi Horo8e0dfac22022-06-09 01:42:57362 bool require_network_isolation_key_ = false;
Matt Menkeee10f0412020-05-14 14:16:03363
Stefano Duo44af16c2022-02-10 15:23:11364 NetworkChangeNotifier::NetworkHandle bound_network_;
365
gab47aa7da2017-06-02 16:09:43366 THREAD_CHECKER(thread_checker_);
initial.commit586acc5fe2008-07-26 22:42:52367};
368
[email protected]27a112c2011-01-06 04:19:30369} // namespace net
370
[email protected]43530b32008-08-04 22:21:34371#endif // NET_URL_REQUEST_URL_REQUEST_CONTEXT_H_