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.
5 #include "net/url_request/url_request_context_builder.h"
9 #include "base/basictypes.h"
10 #include "base/compiler_specific.h"
11 #include "base/logging.h"
12 #include "base/strings/string_util.h"
13 #include "base/thread_task_runner_handle.h"
14 #include "base/threading/thread.h"
15 #include "net/base/cache_type.h"
16 #include "net/base/net_errors.h"
17 #include "net/base/network_delegate.h"
18 #include "net/cert/cert_verifier.h"
19 #include "net/cookies/cookie_monster.h"
20 #include "net/dns/host_resolver.h"
21 #include "net/ftp/ftp_network_layer.h"
22 #include "net/http/http_auth_handler_factory.h"
23 #include "net/http/http_cache.h"
24 #include "net/http/http_network_layer.h"
25 #include "net/http/http_network_session.h"
26 #include "net/http/http_server_properties_impl.h"
27 #include "net/http/transport_security_state.h"
28 #include "net/proxy/proxy_service.h"
29 #include "net/ssl/ssl_config_service_defaults.h"
30 #include "net/url_request/data_protocol_handler.h"
31 #include "net/url_request/static_http_user_agent_settings.h"
32 #include "net/url_request/url_request_context.h"
33 #include "net/url_request/url_request_context_storage.h"
34 #include "net/url_request/url_request_job_factory_impl.h"
36 #if !defined(DISABLE_FILE_SUPPORT)
37 #include "net/url_request/file_protocol_handler.h"
40 #if !defined(DISABLE_FTP_SUPPORT)
41 #include "net/url_request/ftp_protocol_handler.h"
48 class BasicNetworkDelegate
: public NetworkDelegate
{
50 BasicNetworkDelegate() {}
51 virtual ~BasicNetworkDelegate() {}
54 virtual int OnBeforeURLRequest(URLRequest
* request
,
55 const CompletionCallback
& callback
,
56 GURL
* new_url
) OVERRIDE
{
60 virtual int OnBeforeSendHeaders(URLRequest
* request
,
61 const CompletionCallback
& callback
,
62 HttpRequestHeaders
* headers
) OVERRIDE
{
66 virtual void OnSendHeaders(URLRequest
* request
,
67 const HttpRequestHeaders
& headers
) OVERRIDE
{}
69 virtual int OnHeadersReceived(
71 const CompletionCallback
& callback
,
72 const HttpResponseHeaders
* original_response_headers
,
73 scoped_refptr
<HttpResponseHeaders
>* override_response_headers
,
74 GURL
* allowed_unsafe_redirect_url
) OVERRIDE
{
78 virtual void OnBeforeRedirect(URLRequest
* request
,
79 const GURL
& new_location
) OVERRIDE
{}
81 virtual void OnResponseStarted(URLRequest
* request
) OVERRIDE
{}
83 virtual void OnRawBytesRead(const URLRequest
& request
,
84 int bytes_read
) OVERRIDE
{}
86 virtual void OnCompleted(URLRequest
* request
, bool started
) OVERRIDE
{}
88 virtual void OnURLRequestDestroyed(URLRequest
* request
) OVERRIDE
{}
90 virtual void OnPACScriptError(int line_number
,
91 const base::string16
& error
) OVERRIDE
{}
93 virtual NetworkDelegate::AuthRequiredResponse
OnAuthRequired(
95 const AuthChallengeInfo
& auth_info
,
96 const AuthCallback
& callback
,
97 AuthCredentials
* credentials
) OVERRIDE
{
98 return NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION
;
101 virtual bool OnCanGetCookies(const URLRequest
& request
,
102 const CookieList
& cookie_list
) OVERRIDE
{
106 virtual bool OnCanSetCookie(const URLRequest
& request
,
107 const std::string
& cookie_line
,
108 CookieOptions
* options
) OVERRIDE
{
112 virtual bool OnCanAccessFile(const net::URLRequest
& request
,
113 const base::FilePath
& path
) const OVERRIDE
{
117 virtual bool OnCanThrottleRequest(const URLRequest
& request
) const OVERRIDE
{
121 virtual int OnBeforeSocketStreamConnect(
122 SocketStream
* stream
,
123 const CompletionCallback
& callback
) OVERRIDE
{
127 DISALLOW_COPY_AND_ASSIGN(BasicNetworkDelegate
);
130 class BasicURLRequestContext
: public URLRequestContext
{
132 BasicURLRequestContext()
135 URLRequestContextStorage
* storage() {
139 base::Thread
* GetCacheThread() {
140 if (!cache_thread_
) {
141 cache_thread_
.reset(new base::Thread("Cache Thread"));
142 cache_thread_
->StartWithOptions(
143 base::Thread::Options(base::MessageLoop::TYPE_IO
, 0));
145 return cache_thread_
.get();
148 base::Thread
* GetFileThread() {
150 file_thread_
.reset(new base::Thread("File Thread"));
151 file_thread_
->StartWithOptions(
152 base::Thread::Options(base::MessageLoop::TYPE_DEFAULT
, 0));
154 return file_thread_
.get();
158 virtual ~BasicURLRequestContext() {}
161 scoped_ptr
<base::Thread
> cache_thread_
;
162 scoped_ptr
<base::Thread
> file_thread_
;
163 URLRequestContextStorage storage_
;
164 DISALLOW_COPY_AND_ASSIGN(BasicURLRequestContext
);
169 URLRequestContextBuilder::HttpCacheParams::HttpCacheParams()
172 URLRequestContextBuilder::HttpCacheParams::~HttpCacheParams() {}
174 URLRequestContextBuilder::HttpNetworkSessionParams::HttpNetworkSessionParams()
175 : ignore_certificate_errors(false),
176 host_mapping_rules(NULL
),
177 http_pipelining_enabled(false),
178 testing_fixed_http_port(0),
179 testing_fixed_https_port(0),
180 trusted_spdy_proxy() {}
182 URLRequestContextBuilder::HttpNetworkSessionParams::~HttpNetworkSessionParams()
185 URLRequestContextBuilder::SchemeFactory::SchemeFactory(
186 const std::string
& auth_scheme
,
187 net::HttpAuthHandlerFactory
* auth_handler_factory
)
188 : scheme(auth_scheme
), factory(auth_handler_factory
) {
191 URLRequestContextBuilder::SchemeFactory::~SchemeFactory() {
194 URLRequestContextBuilder::URLRequestContextBuilder()
195 : data_enabled_(false),
196 #if !defined(DISABLE_FILE_SUPPORT)
197 file_enabled_(false),
199 #if !defined(DISABLE_FTP_SUPPORT)
202 http_cache_enabled_(true) {
205 URLRequestContextBuilder::~URLRequestContextBuilder() {}
207 void URLRequestContextBuilder::set_proxy_config_service(
208 ProxyConfigService
* proxy_config_service
) {
209 proxy_config_service_
.reset(proxy_config_service
);
212 URLRequestContext
* URLRequestContextBuilder::Build() {
213 BasicURLRequestContext
* context
= new BasicURLRequestContext
;
214 URLRequestContextStorage
* storage
= context
->storage();
216 storage
->set_http_user_agent_settings(new StaticHttpUserAgentSettings(
217 accept_language_
, user_agent_
));
219 if (!network_delegate_
)
220 network_delegate_
.reset(new BasicNetworkDelegate
);
221 NetworkDelegate
* network_delegate
= network_delegate_
.release();
222 storage
->set_network_delegate(network_delegate
);
225 host_resolver_
= net::HostResolver::CreateDefaultResolver(NULL
);
226 storage
->set_host_resolver(host_resolver_
.Pass());
228 storage
->set_net_log(new net::NetLog
);
230 // TODO(willchan): Switch to using this code when
231 // ProxyService::CreateSystemProxyConfigService()'s signature doesn't suck.
232 #if defined(OS_LINUX) || defined(OS_ANDROID)
233 ProxyConfigService
* proxy_config_service
= proxy_config_service_
.release();
235 ProxyConfigService
* proxy_config_service
= NULL
;
236 if (proxy_config_service_
) {
237 proxy_config_service
= proxy_config_service_
.release();
239 proxy_config_service
=
240 ProxyService::CreateSystemProxyConfigService(
241 base::ThreadTaskRunnerHandle::Get().get(),
242 context
->GetFileThread()->message_loop());
244 #endif // defined(OS_LINUX) || defined(OS_ANDROID)
245 storage
->set_proxy_service(
246 ProxyService::CreateUsingSystemProxyResolver(
247 proxy_config_service
,
248 4, // TODO(willchan): Find a better constant somewhere.
249 context
->net_log()));
250 storage
->set_ssl_config_service(new net::SSLConfigServiceDefaults
);
251 HttpAuthHandlerRegistryFactory
* http_auth_handler_registry_factory
=
252 net::HttpAuthHandlerRegistryFactory::CreateDefault(
253 context
->host_resolver());
254 for (size_t i
= 0; i
< extra_http_auth_handlers_
.size(); ++i
) {
255 http_auth_handler_registry_factory
->RegisterSchemeFactory(
256 extra_http_auth_handlers_
[i
].scheme
,
257 extra_http_auth_handlers_
[i
].factory
);
259 storage
->set_http_auth_handler_factory(http_auth_handler_registry_factory
);
260 storage
->set_cookie_store(new CookieMonster(NULL
, NULL
));
261 storage
->set_transport_security_state(new net::TransportSecurityState());
262 storage
->set_http_server_properties(
263 scoped_ptr
<net::HttpServerProperties
>(
264 new net::HttpServerPropertiesImpl()));
265 storage
->set_cert_verifier(CertVerifier::CreateDefault());
267 net::HttpNetworkSession::Params network_session_params
;
268 network_session_params
.host_resolver
= context
->host_resolver();
269 network_session_params
.cert_verifier
= context
->cert_verifier();
270 network_session_params
.transport_security_state
=
271 context
->transport_security_state();
272 network_session_params
.proxy_service
= context
->proxy_service();
273 network_session_params
.ssl_config_service
=
274 context
->ssl_config_service();
275 network_session_params
.http_auth_handler_factory
=
276 context
->http_auth_handler_factory();
277 network_session_params
.network_delegate
= network_delegate
;
278 network_session_params
.http_server_properties
=
279 context
->http_server_properties();
280 network_session_params
.net_log
= context
->net_log();
281 network_session_params
.ignore_certificate_errors
=
282 http_network_session_params_
.ignore_certificate_errors
;
283 network_session_params
.host_mapping_rules
=
284 http_network_session_params_
.host_mapping_rules
;
285 network_session_params
.http_pipelining_enabled
=
286 http_network_session_params_
.http_pipelining_enabled
;
287 network_session_params
.testing_fixed_http_port
=
288 http_network_session_params_
.testing_fixed_http_port
;
289 network_session_params
.testing_fixed_https_port
=
290 http_network_session_params_
.testing_fixed_https_port
;
291 network_session_params
.trusted_spdy_proxy
=
292 http_network_session_params_
.trusted_spdy_proxy
;
294 HttpTransactionFactory
* http_transaction_factory
= NULL
;
295 if (http_cache_enabled_
) {
296 network_session_params
.server_bound_cert_service
=
297 context
->server_bound_cert_service();
298 HttpCache::BackendFactory
* http_cache_backend
= NULL
;
299 if (http_cache_params_
.type
== HttpCacheParams::DISK
) {
300 http_cache_backend
= new HttpCache::DefaultBackend(
302 net::CACHE_BACKEND_DEFAULT
,
303 http_cache_params_
.path
,
304 http_cache_params_
.max_size
,
305 context
->GetCacheThread()->message_loop_proxy().get());
308 HttpCache::DefaultBackend::InMemory(http_cache_params_
.max_size
);
311 http_transaction_factory
= new HttpCache(
312 network_session_params
, http_cache_backend
);
314 scoped_refptr
<net::HttpNetworkSession
> network_session(
315 new net::HttpNetworkSession(network_session_params
));
317 http_transaction_factory
= new HttpNetworkLayer(network_session
.get());
319 storage
->set_http_transaction_factory(http_transaction_factory
);
321 URLRequestJobFactoryImpl
* job_factory
= new URLRequestJobFactoryImpl
;
323 job_factory
->SetProtocolHandler("data", new DataProtocolHandler
);
325 #if !defined(DISABLE_FILE_SUPPORT)
327 job_factory
->SetProtocolHandler(
329 new FileProtocolHandler(context
->GetFileThread()->message_loop_proxy()));
331 #endif // !defined(DISABLE_FILE_SUPPORT)
333 #if !defined(DISABLE_FTP_SUPPORT)
335 ftp_transaction_factory_
.reset(
336 new FtpNetworkLayer(context
->host_resolver()));
337 job_factory
->SetProtocolHandler("ftp",
338 new FtpProtocolHandler(ftp_transaction_factory_
.get()));
340 #endif // !defined(DISABLE_FTP_SUPPORT)
342 storage
->set_job_factory(job_factory
);
344 // TODO(willchan): Support sdch.