blob: c1d56098cb488ce6b5acfb87e454cb8c73db8aea [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
danakj8522a25b2016-04-16 00:17:3611#include <memory>
[email protected]7c52ed92012-04-06 15:42:4012#include <set>
[email protected]ee4c30d2012-11-07 15:08:4313#include <string>
[email protected]7c52ed92012-04-06 15:42:4014
Avi Drissman13fc8932015-12-20 04:40:4615#include "base/macros.h"
[email protected]3b63f8f42011-03-28 01:54:1516#include "base/memory/ref_counted.h"
[email protected]18590f22011-07-29 16:41:2817#include "base/memory/weak_ptr.h"
gab47aa7da2017-06-02 16:09:4318#include "base/threading/thread_checker.h"
xunjieli96ab36a72016-12-05 21:36:0519#include "base/trace_event/memory_dump_provider.h"
Nicolas Ouellet-Payeur6e833b52019-07-02 17:18:0820#include "build/build_config.h"
[email protected]172da1b2011-08-12 15:52:2621#include "net/base/net_export.h"
[email protected]2ca01e52013-10-31 22:05:1922#include "net/base/request_priority.h"
[email protected]c2dad292012-09-07 21:27:3523#include "net/http/http_network_session.h"
[email protected]db96a882011-10-09 02:01:5424#include "net/http/http_server_properties.h"
[email protected]536fd0b2013-03-14 17:41:5725#include "net/http/transport_security_state.h"
Scott Violet0caaaf432018-03-24 00:43:5926#include "net/net_buildflags.h"
rhalavatia9b551d2017-02-09 12:03:0027#include "net/traffic_annotation/network_traffic_annotation.h"
[email protected]8a26ff62012-08-24 21:49:2028#include "net/url_request/url_request.h"
initial.commit586acc5fe2008-07-26 22:42:5229
xunjieli96ab36a72016-12-05 21:36:0530namespace base {
31namespace trace_event {
32class ProcessMemoryDump;
33}
34}
35
[email protected]8ac1a752008-07-31 19:40:3736namespace net {
[email protected]822581d2010-12-16 17:27:1537class CertVerifier;
[email protected]9349cfb2010-08-31 18:00:5338class CookieStore;
rsleevid6de8302016-06-21 01:33:2039class CTPolicyEnforcer;
[email protected]284303b62013-11-28 15:11:5440class CTVerifier;
[email protected]9349cfb2010-08-31 18:00:5341class HostResolver;
[email protected]fa55e192010-02-15 14:25:5042class HttpAuthHandlerFactory;
[email protected]b65ce0942009-03-16 20:13:3343class HttpTransactionFactory;
[email protected]ee4c30d2012-11-07 15:08:4344class HttpUserAgentSettings;
mikecironef22f9812016-10-04 03:40:1945class NetLog;
[email protected]0651b812011-02-24 00:22:5046class NetworkDelegate;
tbansalea2fb8c2015-05-22 22:23:0047class NetworkQualityEstimator;
Wojciech Dzierżanowski1f823562019-01-18 11:26:0048class ProxyDelegate;
Nicolas Arciniega8ec5bfa2020-03-20 05:07:2649class ProxyResolutionService;
Victor Vasiliev7752898d2019-11-14 21:30:2250class QuicContext;
Ryan Sleevib8449e02018-07-15 04:31:0751class SSLConfigService;
[email protected]eaadd9052009-06-23 18:02:2352class URLRequest;
[email protected]a8c1e7452011-05-14 06:17:0753class URLRequestJobFactory;
[email protected]a73a2802012-05-02 19:20:1554class URLRequestThrottlerManager;
initial.commit586acc5fe2008-07-26 22:42:5255
Emily Stark01227982019-06-06 18:45:5656#if !BUILDFLAG(DISABLE_FTP_SUPPORT)
57class FtpAuthCache;
58#endif // !BUILDFLAG(DISABLE_FTP_SUPPORT)
59
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.
[email protected]172da1b2011-08-12 15:52:2671class NET_EXPORT URLRequestContext
gab47aa7da2017-06-02 16:09:4372 : public base::trace_event::MemoryDumpProvider {
initial.commit586acc5fe2008-07-26 22:42:5273 public:
Maks Orlovich9fdb7272019-12-13 01:28:2374 URLRequestContext();
xunjieli96ab36a72016-12-05 21:36:0575 ~URLRequestContext() override;
[email protected]18590f22011-07-29 16:41:2876
tbansalea2fb8c2015-05-22 22:23:0077 // May return nullptr if this context doesn't have an associated network
78 // session.
[email protected]c2dad292012-09-07 21:27:3579 const HttpNetworkSession::Params* GetNetworkSessionParams() const;
80
mmenke6ddfbea2017-05-31 21:48:4181 // May return nullptr if this context doesn't have an associated network
82 // session.
83 const HttpNetworkSession::Context* GetNetworkSessionContext() const;
84
Nicolas Ouellet-Payeur6e833b52019-07-02 17:18:0885#if (!defined(OS_WIN) && !defined(OS_LINUX)) || defined(OS_CHROMEOS)
rhalavatia9b551d2017-02-09 12:03:0086 // This function should not be used in Chromium, please use the version with
87 // NetworkTrafficAnnotationTag in the future.
Nicolas Ouellet-Payeur6e833b52019-07-02 17:18:0888 //
89 // The unannotated method is not available on desktop Linux + Windows. It's
90 // available on other platforms, since we only audit network annotations on
91 // Linux & Windows.
danakj8522a25b2016-04-16 00:17:3692 std::unique_ptr<URLRequest> CreateRequest(
93 const GURL& url,
94 RequestPriority priority,
95 URLRequest::Delegate* delegate) const;
Nicolas Ouellet-Payeur6e833b52019-07-02 17:18:0896#endif
[email protected]8a26ff62012-08-24 21:49:2097
rhalavatia9b551d2017-02-09 12:03:0098 // |traffic_annotation| is metadata about the network traffic send via this
99 // URLRequest, see net::DefineNetworkTrafficAnnotation. Note that:
100 // - net provides the API for tagging requests with an opaque identifier.
101 // - tools/traffic_annotation/traffic_annotation.proto contains the Chrome
102 // specific .proto describing the verbose annotation format that Chrome's
103 // callsites are expected to follow.
104 // - tools/traffic_annotation/ contains sample and template for annotation and
105 // tools will be added for verification following crbug.com/690323.
106 std::unique_ptr<URLRequest> CreateRequest(
107 const GURL& url,
108 RequestPriority priority,
109 URLRequest::Delegate* delegate,
110 NetworkTrafficAnnotationTag traffic_annotation) const;
111
112 NetLog* net_log() const { return net_log_; }
[email protected]9e743cd2010-03-16 07:03:53113
[email protected]27a112c2011-01-06 04:19:30114 void set_net_log(NetLog* net_log) {
[email protected]2fb629202010-12-23 23:52:57115 net_log_ = net_log;
116 }
117
[email protected]27a112c2011-01-06 04:19:30118 HostResolver* host_resolver() const {
[email protected]8a00f00a2009-06-12 00:49:38119 return host_resolver_;
120 }
121
[email protected]27a112c2011-01-06 04:19:30122 void set_host_resolver(HostResolver* host_resolver) {
Eric Orth5d9958c2019-09-27 20:43:18123 DCHECK(host_resolver);
[email protected]2fb629202010-12-23 23:52:57124 host_resolver_ = host_resolver;
125 }
126
[email protected]27a112c2011-01-06 04:19:30127 CertVerifier* cert_verifier() const {
[email protected]822581d2010-12-16 17:27:15128 return cert_verifier_;
129 }
130
[email protected]27a112c2011-01-06 04:19:30131 void set_cert_verifier(CertVerifier* cert_verifier) {
[email protected]2fb629202010-12-23 23:52:57132 cert_verifier_ = cert_verifier;
133 }
134
[email protected]63de95b2008-12-10 04:11:27135 // Get the proxy service for this context.
Nicolas Arciniega8ec5bfa2020-03-20 05:07:26136 ProxyResolutionService* proxy_resolution_service() const {
Lily Houghton8c2f97d2018-01-22 05:06:59137 return proxy_resolution_service_;
138 }
139 void set_proxy_resolution_service(
Nicolas Arciniega8ec5bfa2020-03-20 05:07:26140 ProxyResolutionService* proxy_resolution_service) {
Lily Houghton8c2f97d2018-01-22 05:06:59141 proxy_resolution_service_ = proxy_resolution_service;
[email protected]2fb629202010-12-23 23:52:57142 }
143
Wojciech Dzierżanowski1f823562019-01-18 11:26:00144 ProxyDelegate* proxy_delegate() const { return proxy_delegate_; }
145 void set_proxy_delegate(ProxyDelegate* proxy_delegate) {
146 proxy_delegate_ = proxy_delegate;
147 }
148
[email protected]db36938c2009-08-19 21:48:42149 // Get the ssl config service for this context.
Ryan Sleevib8449e02018-07-15 04:31:07150 SSLConfigService* ssl_config_service() const { return ssl_config_service_; }
151 void set_ssl_config_service(SSLConfigService* service) {
152 ssl_config_service_ = service;
[email protected]db36938c2009-08-19 21:48:42153 }
154
[email protected]2fb629202010-12-23 23:52:57155 // Gets the HTTP Authentication Handler Factory for this context.
156 // The factory is only valid for the lifetime of this URLRequestContext
[email protected]ef2bf422012-05-11 03:27:09157 HttpAuthHandlerFactory* http_auth_handler_factory() const {
[email protected]2fb629202010-12-23 23:52:57158 return http_auth_handler_factory_;
159 }
[email protected]27a112c2011-01-06 04:19:30160 void set_http_auth_handler_factory(HttpAuthHandlerFactory* factory) {
[email protected]2fb629202010-12-23 23:52:57161 http_auth_handler_factory_ = factory;
162 }
163
initial.commit586acc5fe2008-07-26 22:42:52164 // Gets the http transaction factory for this context.
[email protected]27a112c2011-01-06 04:19:30165 HttpTransactionFactory* http_transaction_factory() const {
[email protected]db8f44c2008-12-13 04:52:01166 return http_transaction_factory_;
initial.commit586acc5fe2008-07-26 22:42:52167 }
[email protected]27a112c2011-01-06 04:19:30168 void set_http_transaction_factory(HttpTransactionFactory* factory) {
[email protected]2fb629202010-12-23 23:52:57169 http_transaction_factory_ = factory;
170 }
171
[email protected]0651b812011-02-24 00:22:50172 void set_network_delegate(NetworkDelegate* network_delegate) {
[email protected]d05ef99c2011-02-01 21:38:16173 network_delegate_ = network_delegate;
174 }
[email protected]0651b812011-02-24 00:22:50175 NetworkDelegate* network_delegate() const { return network_delegate_; }
[email protected]d05ef99c2011-02-01 21:38:16176
[email protected]db96a882011-10-09 02:01:54177 void set_http_server_properties(
bnc525e175a2016-06-20 12:36:40178 HttpServerProperties* http_server_properties) {
[email protected]db96a882011-10-09 02:01:54179 http_server_properties_ = http_server_properties;
180 }
bnc525e175a2016-06-20 12:36:40181 HttpServerProperties* http_server_properties() const {
[email protected]db96a882011-10-09 02:01:54182 return http_server_properties_;
183 }
184
[email protected]be6fca6c2010-01-30 21:48:57185 // Gets the cookie store for this context (may be null, in which case
186 // cookies are not stored).
mmenke606c59c2016-03-07 18:20:55187 CookieStore* cookie_store() const { return cookie_store_; }
[email protected]27a112c2011-01-06 04:19:30188 void set_cookie_store(CookieStore* cookie_store);
[email protected]2fb629202010-12-23 23:52:57189
[email protected]f6c21cb2011-02-16 19:45:41190 TransportSecurityState* transport_security_state() const {
[email protected]284303b62013-11-28 15:11:54191 return transport_security_state_;
[email protected]f6c21cb2011-02-16 19:45:41192 }
193 void set_transport_security_state(
[email protected]7461a402011-03-24 23:19:51194 TransportSecurityState* state) {
[email protected]f6c21cb2011-02-16 19:45:41195 transport_security_state_ = state;
196 }
[email protected]a9cea7542009-05-20 04:30:23197
[email protected]284303b62013-11-28 15:11:54198 CTVerifier* cert_transparency_verifier() const {
199 return cert_transparency_verifier_;
200 }
201 void set_cert_transparency_verifier(CTVerifier* verifier) {
202 cert_transparency_verifier_ = verifier;
203 }
204
rsleevid6de8302016-06-21 01:33:20205 CTPolicyEnforcer* ct_policy_enforcer() const { return ct_policy_enforcer_; }
206 void set_ct_policy_enforcer(CTPolicyEnforcer* enforcer) {
207 ct_policy_enforcer_ = enforcer;
208 }
209
[email protected]a8c1e7452011-05-14 06:17:07210 const URLRequestJobFactory* job_factory() const { return job_factory_; }
211 void set_job_factory(const URLRequestJobFactory* job_factory) {
212 job_factory_ = job_factory;
213 }
214
tbansalea2fb8c2015-05-22 22:23:00215 // May return nullptr.
[email protected]a73a2802012-05-02 19:20:15216 URLRequestThrottlerManager* throttler_manager() const {
217 return throttler_manager_;
218 }
219 void set_throttler_manager(URLRequestThrottlerManager* throttler_manager) {
220 throttler_manager_ = throttler_manager;
221 }
222
Victor Vasiliev7752898d2019-11-14 21:30:22223 QuicContext* quic_context() const { return quic_context_; }
224 void set_quic_context(QuicContext* quic_context) {
225 quic_context_ = quic_context;
226 }
227
[email protected]7c52ed92012-04-06 15:42:40228 // Gets the URLRequest objects that hold a reference to this
229 // URLRequestContext.
Helen Lif5e4a752018-01-02 16:03:02230 std::set<const URLRequest*>* url_requests() const {
231 return url_requests_.get();
[email protected]7c52ed92012-04-06 15:42:40232 }
233
[email protected]424559492014-07-22 00:27:40234 // CHECKs that no URLRequests using this context remain. Subclasses should
235 // additionally call AssertNoURLRequests() within their own destructor,
236 // prior to implicit destruction of subclass-owned state.
[email protected]1e714bba2012-04-10 17:01:05237 void AssertNoURLRequests() const;
238
[email protected]ee4c30d2012-11-07 15:08:43239 // Get the underlying |HttpUserAgentSettings| implementation that provides
[email protected]84f05432013-03-15 01:00:12240 // the HTTP Accept-Language and User-Agent header values.
[email protected]ee4c30d2012-11-07 15:08:43241 const HttpUserAgentSettings* http_user_agent_settings() const {
242 return http_user_agent_settings_;
243 }
244 void set_http_user_agent_settings(
mmenke15992ce2017-05-30 21:05:02245 const HttpUserAgentSettings* http_user_agent_settings) {
[email protected]ee4c30d2012-11-07 15:08:43246 http_user_agent_settings_ = http_user_agent_settings;
247 }
248
tbansalea2fb8c2015-05-22 22:23:00249 // Gets the NetworkQualityEstimator associated with this context.
250 // May return nullptr.
251 NetworkQualityEstimator* network_quality_estimator() const {
252 return network_quality_estimator_;
253 }
254 void set_network_quality_estimator(
255 NetworkQualityEstimator* network_quality_estimator) {
256 network_quality_estimator_ = network_quality_estimator;
257 }
258
Julia Tuttle3f9acac2017-11-20 22:06:30259#if BUILDFLAG(ENABLE_REPORTING)
juliatuttle2b8dd2d12017-04-12 21:27:41260 ReportingService* reporting_service() const { return reporting_service_; }
261 void set_reporting_service(ReportingService* reporting_service) {
262 reporting_service_ = reporting_service;
263 }
264
Julia Tuttlecba7d222018-02-23 19:37:27265 NetworkErrorLoggingService* network_error_logging_service() const {
266 return network_error_logging_service_;
Julia Tuttlef9b74062017-07-27 14:44:05267 }
Julia Tuttlecba7d222018-02-23 19:37:27268 void set_network_error_logging_service(
269 NetworkErrorLoggingService* network_error_logging_service) {
270 network_error_logging_service_ = network_error_logging_service;
Julia Tuttlef9b74062017-07-27 14:44:05271 }
Julia Tuttle3f9acac2017-11-20 22:06:30272#endif // BUILDFLAG(ENABLE_REPORTING)
Julia Tuttlef9b74062017-07-27 14:44:05273
maksim.sisov3d40c812016-05-02 13:27:16274 void set_enable_brotli(bool enable_brotli) { enable_brotli_ = enable_brotli; }
275
276 bool enable_brotli() const { return enable_brotli_; }
277
mgershd21d6d142016-12-14 23:06:36278 // Sets the |check_cleartext_permitted| flag, which controls whether to check
279 // system policy before allowing a cleartext http or ws request.
280 void set_check_cleartext_permitted(bool check_cleartext_permitted) {
281 check_cleartext_permitted_ = check_cleartext_permitted;
282 }
283
284 // Returns current value of the |check_cleartext_permitted| flag.
285 bool check_cleartext_permitted() const { return check_cleartext_permitted_; }
286
Matt Menkeee10f0412020-05-14 14:16:03287 void set_require_network_isolation_key(bool require_network_isolation_key) {
288 require_network_isolation_key_ = require_network_isolation_key;
289 }
290 bool require_network_isolation_key() const {
291 return require_network_isolation_key_;
292 }
293
Emily Stark01227982019-06-06 18:45:56294#if !BUILDFLAG(DISABLE_FTP_SUPPORT)
295 void set_ftp_auth_cache(FtpAuthCache* auth_cache) {
296 ftp_auth_cache_ = auth_cache;
297 }
298 FtpAuthCache* ftp_auth_cache() { return ftp_auth_cache_; }
299#endif // !BUILDFLAG(DISABLE_FTP_SUPPORT)
300
xunjieli96ab36a72016-12-05 21:36:05301 // Sets a name for this URLRequestContext. Currently the name is used in
302 // MemoryDumpProvier to annotate memory usage. The name does not need to be
303 // unique.
Matt Menke7d4b66f72017-09-26 04:09:55304 void set_name(const std::string& name) { name_ = name; }
305 const std::string& name() const { return name_; }
xunjieli96ab36a72016-12-05 21:36:05306
307 // MemoryDumpProvider implementation:
xunjieli0c0ed3be2017-06-23 14:08:35308 // This is reported as
309 // "memory:chrome:all_processes:reported_by_chrome:net:effective_size_avg."
xunjieli96ab36a72016-12-05 21:36:05310 bool OnMemoryDump(const base::trace_event::MemoryDumpArgs& args,
311 base::trace_event::ProcessMemoryDump* pmd) override;
312
gab47aa7da2017-06-02 16:09:43313 void AssertCalledOnValidThread() {
314 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
315 }
316
[email protected]f6c21cb2011-02-16 19:45:41317 private:
[email protected]f6c21cb2011-02-16 19:45:41318 // Ownership for these members are not defined here. Clients should either
319 // provide storage elsewhere or have a subclass take ownership.
[email protected]27a112c2011-01-06 04:19:30320 NetLog* net_log_;
321 HostResolver* host_resolver_;
322 CertVerifier* cert_verifier_;
[email protected]f6c21cb2011-02-16 19:45:41323 HttpAuthHandlerFactory* http_auth_handler_factory_;
Nicolas Arciniega8ec5bfa2020-03-20 05:07:26324 ProxyResolutionService* proxy_resolution_service_;
Wojciech Dzierżanowski1f823562019-01-18 11:26:00325 ProxyDelegate* proxy_delegate_;
Ryan Sleevib8449e02018-07-15 04:31:07326 SSLConfigService* ssl_config_service_;
[email protected]0651b812011-02-24 00:22:50327 NetworkDelegate* network_delegate_;
bnc525e175a2016-06-20 12:36:40328 HttpServerProperties* http_server_properties_;
mmenke15992ce2017-05-30 21:05:02329 const HttpUserAgentSettings* http_user_agent_settings_;
mmenke606c59c2016-03-07 18:20:55330 CookieStore* cookie_store_;
[email protected]edbc4f92011-09-27 21:04:49331 TransportSecurityState* transport_security_state_;
[email protected]284303b62013-11-28 15:11:54332 CTVerifier* cert_transparency_verifier_;
rsleevid6de8302016-06-21 01:33:20333 CTPolicyEnforcer* ct_policy_enforcer_;
[email protected]f6c21cb2011-02-16 19:45:41334 HttpTransactionFactory* http_transaction_factory_;
[email protected]a8c1e7452011-05-14 06:17:07335 const URLRequestJobFactory* job_factory_;
[email protected]a73a2802012-05-02 19:20:15336 URLRequestThrottlerManager* throttler_manager_;
Victor Vasiliev7752898d2019-11-14 21:30:22337 QuicContext* quic_context_;
tbansalea2fb8c2015-05-22 22:23:00338 NetworkQualityEstimator* network_quality_estimator_;
Julia Tuttle3f9acac2017-11-20 22:06:30339#if BUILDFLAG(ENABLE_REPORTING)
juliatuttle2b8dd2d12017-04-12 21:27:41340 ReportingService* reporting_service_;
Julia Tuttlecba7d222018-02-23 19:37:27341 NetworkErrorLoggingService* network_error_logging_service_;
Julia Tuttle3f9acac2017-11-20 22:06:30342#endif // BUILDFLAG(ENABLE_REPORTING)
Emily Stark01227982019-06-06 18:45:56343#if !BUILDFLAG(DISABLE_FTP_SUPPORT)
344 FtpAuthCache* ftp_auth_cache_;
345#endif // !BUILDFLAG(DISABLE_FTP_SUPPORT)
[email protected]70b92342010-10-12 05:54:06346
Helen Lif5e4a752018-01-02 16:03:02347 std::unique_ptr<std::set<const URLRequest*>> url_requests_;
[email protected]7c52ed92012-04-06 15:42:40348
maksim.sisov3d40c812016-05-02 13:27:16349 // Enables Brotli Content-Encoding support.
350 bool enable_brotli_;
mgershd21d6d142016-12-14 23:06:36351 // Enables checking system policy before allowing a cleartext http or ws
352 // request. Only used on Android.
353 bool check_cleartext_permitted_;
maksim.sisov3d40c812016-05-02 13:27:16354
Matt Menkeee10f0412020-05-14 14:16:03355 // Triggers a DCHECK if a NetworkIsolationKey/IsolationInfo is not provided to
356 // a request when true.
357 bool require_network_isolation_key_;
358
xunjieli96ab36a72016-12-05 21:36:05359 // An optional name which can be set to describe this URLRequestContext.
360 // Used in MemoryDumpProvier to annotate memory usage. The name does not need
361 // to be unique.
Matt Menke7d4b66f72017-09-26 04:09:55362 std::string name_;
xunjieli96ab36a72016-12-05 21:36:05363
gab47aa7da2017-06-02 16:09:43364 THREAD_CHECKER(thread_checker_);
365
[email protected]6f681a42009-01-27 22:28:54366 DISALLOW_COPY_AND_ASSIGN(URLRequestContext);
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_