OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/dns/host_resolver_impl.h" | 5 #include "net/dns/host_resolver_impl.h" |
6 | 6 |
7 #if defined(OS_WIN) | 7 #if defined(OS_WIN) |
8 #include <Winsock2.h> | 8 #include <Winsock2.h> |
9 #elif defined(OS_POSIX) | 9 #elif defined(OS_POSIX) |
10 #include <netdb.h> | 10 #include <netdb.h> |
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
295 return false; | 295 return false; |
296 default: | 296 default: |
297 NOTREACHED(); | 297 NOTREACHED(); |
298 return false; | 298 return false; |
299 } | 299 } |
300 } | 300 } |
301 return true; | 301 return true; |
302 } | 302 } |
303 | 303 |
304 // Creates NetLog parameters when the resolve failed. | 304 // Creates NetLog parameters when the resolve failed. |
305 base::Value* NetLogProcTaskFailedCallback( | 305 scoped_ptr<base::Value> NetLogProcTaskFailedCallback( |
306 uint32 attempt_number, | 306 uint32 attempt_number, |
307 int net_error, | 307 int net_error, |
308 int os_error, | 308 int os_error, |
309 NetLogCaptureMode /* capture_mode */) { | 309 NetLogCaptureMode /* capture_mode */) { |
310 base::DictionaryValue* dict = new base::DictionaryValue(); | 310 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
311 if (attempt_number) | 311 if (attempt_number) |
312 dict->SetInteger("attempt_number", attempt_number); | 312 dict->SetInteger("attempt_number", attempt_number); |
313 | 313 |
314 dict->SetInteger("net_error", net_error); | 314 dict->SetInteger("net_error", net_error); |
315 | 315 |
316 if (os_error) { | 316 if (os_error) { |
317 dict->SetInteger("os_error", os_error); | 317 dict->SetInteger("os_error", os_error); |
318 #if defined(OS_POSIX) | 318 #if defined(OS_POSIX) |
319 dict->SetString("os_error_string", gai_strerror(os_error)); | 319 dict->SetString("os_error_string", gai_strerror(os_error)); |
320 #elif defined(OS_WIN) | 320 #elif defined(OS_WIN) |
321 // Map the error code to a human-readable string. | 321 // Map the error code to a human-readable string. |
322 LPWSTR error_string = NULL; | 322 LPWSTR error_string = NULL; |
323 FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, | 323 FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, |
324 0, // Use the internal message table. | 324 0, // Use the internal message table. |
325 os_error, | 325 os_error, |
326 0, // Use default language. | 326 0, // Use default language. |
327 (LPWSTR)&error_string, | 327 (LPWSTR)&error_string, |
328 0, // Buffer size. | 328 0, // Buffer size. |
329 0); // Arguments (unused). | 329 0); // Arguments (unused). |
330 dict->SetString("os_error_string", base::WideToUTF8(error_string)); | 330 dict->SetString("os_error_string", base::WideToUTF8(error_string)); |
331 LocalFree(error_string); | 331 LocalFree(error_string); |
332 #endif | 332 #endif |
333 } | 333 } |
334 | 334 |
335 return dict; | 335 return dict.Pass(); |
336 } | 336 } |
337 | 337 |
338 // Creates NetLog parameters when the DnsTask failed. | 338 // Creates NetLog parameters when the DnsTask failed. |
339 base::Value* NetLogDnsTaskFailedCallback(int net_error, | 339 scoped_ptr<base::Value> NetLogDnsTaskFailedCallback( |
340 int dns_error, | 340 int net_error, |
341 NetLogCaptureMode /* capture_mode */) { | 341 int dns_error, |
342 base::DictionaryValue* dict = new base::DictionaryValue(); | 342 NetLogCaptureMode /* capture_mode */) { |
| 343 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
343 dict->SetInteger("net_error", net_error); | 344 dict->SetInteger("net_error", net_error); |
344 if (dns_error) | 345 if (dns_error) |
345 dict->SetInteger("dns_error", dns_error); | 346 dict->SetInteger("dns_error", dns_error); |
346 return dict; | 347 return dict.Pass(); |
347 }; | 348 }; |
348 | 349 |
349 // Creates NetLog parameters containing the information in a RequestInfo object, | 350 // Creates NetLog parameters containing the information in a RequestInfo object, |
350 // along with the associated NetLog::Source. | 351 // along with the associated NetLog::Source. |
351 base::Value* NetLogRequestInfoCallback(const HostResolver::RequestInfo* info, | 352 scoped_ptr<base::Value> NetLogRequestInfoCallback( |
352 NetLogCaptureMode /* capture_mode */) { | 353 const HostResolver::RequestInfo* info, |
353 base::DictionaryValue* dict = new base::DictionaryValue(); | 354 NetLogCaptureMode /* capture_mode */) { |
| 355 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
354 | 356 |
355 dict->SetString("host", info->host_port_pair().ToString()); | 357 dict->SetString("host", info->host_port_pair().ToString()); |
356 dict->SetInteger("address_family", | 358 dict->SetInteger("address_family", |
357 static_cast<int>(info->address_family())); | 359 static_cast<int>(info->address_family())); |
358 dict->SetBoolean("allow_cached_response", info->allow_cached_response()); | 360 dict->SetBoolean("allow_cached_response", info->allow_cached_response()); |
359 dict->SetBoolean("is_speculative", info->is_speculative()); | 361 dict->SetBoolean("is_speculative", info->is_speculative()); |
360 return dict; | 362 return dict.Pass(); |
361 } | 363 } |
362 | 364 |
363 // Creates NetLog parameters for the creation of a HostResolverImpl::Job. | 365 // Creates NetLog parameters for the creation of a HostResolverImpl::Job. |
364 base::Value* NetLogJobCreationCallback(const NetLog::Source& source, | 366 scoped_ptr<base::Value> NetLogJobCreationCallback( |
365 const std::string* host, | 367 const NetLog::Source& source, |
366 NetLogCaptureMode /* capture_mode */) { | 368 const std::string* host, |
367 base::DictionaryValue* dict = new base::DictionaryValue(); | 369 NetLogCaptureMode /* capture_mode */) { |
368 source.AddToEventParameters(dict); | 370 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
| 371 source.AddToEventParameters(dict.release()); |
369 dict->SetString("host", *host); | 372 dict->SetString("host", *host); |
370 return dict; | 373 return dict.Pass(); |
371 } | 374 } |
372 | 375 |
373 // Creates NetLog parameters for HOST_RESOLVER_IMPL_JOB_ATTACH/DETACH events. | 376 // Creates NetLog parameters for HOST_RESOLVER_IMPL_JOB_ATTACH/DETACH events. |
374 base::Value* NetLogJobAttachCallback(const NetLog::Source& source, | 377 scoped_ptr<base::Value> NetLogJobAttachCallback( |
375 RequestPriority priority, | 378 const NetLog::Source& source, |
376 NetLogCaptureMode /* capture_mode */) { | 379 RequestPriority priority, |
377 base::DictionaryValue* dict = new base::DictionaryValue(); | 380 NetLogCaptureMode /* capture_mode */) { |
378 source.AddToEventParameters(dict); | 381 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
| 382 source.AddToEventParameters(dict.release()); |
379 dict->SetString("priority", RequestPriorityToString(priority)); | 383 dict->SetString("priority", RequestPriorityToString(priority)); |
380 return dict; | 384 return dict.Pass(); |
381 } | 385 } |
382 | 386 |
383 // Creates NetLog parameters for the DNS_CONFIG_CHANGED event. | 387 // Creates NetLog parameters for the DNS_CONFIG_CHANGED event. |
384 base::Value* NetLogDnsConfigCallback(const DnsConfig* config, | 388 scoped_ptr<base::Value> NetLogDnsConfigCallback( |
385 NetLogCaptureMode /* capture_mode */) { | 389 const DnsConfig* config, |
| 390 NetLogCaptureMode /* capture_mode */) { |
386 return config->ToValue(); | 391 return config->ToValue(); |
387 } | 392 } |
388 | 393 |
389 // The logging routines are defined here because some requests are resolved | 394 // The logging routines are defined here because some requests are resolved |
390 // without a Request object. | 395 // without a Request object. |
391 | 396 |
392 // Logs when a request has just been started. | 397 // Logs when a request has just been started. |
393 void LogStartRequest(const BoundNetLog& source_net_log, | 398 void LogStartRequest(const BoundNetLog& source_net_log, |
394 const HostResolver::RequestInfo& info) { | 399 const HostResolver::RequestInfo& info) { |
395 source_net_log.BeginEvent( | 400 source_net_log.BeginEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_REQUEST, |
396 NetLog::TYPE_HOST_RESOLVER_IMPL_REQUEST, | 401 base::Bind(NetLogRequestInfoCallback, &info)); |
397 base::Bind(&NetLogRequestInfoCallback, &info)); | |
398 } | 402 } |
399 | 403 |
400 // Logs when a request has just completed (before its callback is run). | 404 // Logs when a request has just completed (before its callback is run). |
401 void LogFinishRequest(const BoundNetLog& source_net_log, | 405 void LogFinishRequest(const BoundNetLog& source_net_log, |
402 const HostResolver::RequestInfo& info, | 406 const HostResolver::RequestInfo& info, |
403 int net_error) { | 407 int net_error) { |
404 source_net_log.EndEventWithNetErrorCode( | 408 source_net_log.EndEventWithNetErrorCode( |
405 NetLog::TYPE_HOST_RESOLVER_IMPL_REQUEST, net_error); | 409 NetLog::TYPE_HOST_RESOLVER_IMPL_REQUEST, net_error); |
406 } | 410 } |
407 | 411 |
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
730 if (!was_retry_attempt) | 734 if (!was_retry_attempt) |
731 RecordPerformanceHistograms(start_time, error, os_error); | 735 RecordPerformanceHistograms(start_time, error, os_error); |
732 | 736 |
733 RecordAttemptHistograms(start_time, attempt_number, error, os_error); | 737 RecordAttemptHistograms(start_time, attempt_number, error, os_error); |
734 | 738 |
735 if (was_canceled()) | 739 if (was_canceled()) |
736 return; | 740 return; |
737 | 741 |
738 NetLog::ParametersCallback net_log_callback; | 742 NetLog::ParametersCallback net_log_callback; |
739 if (error != OK) { | 743 if (error != OK) { |
740 net_log_callback = base::Bind(&NetLogProcTaskFailedCallback, | 744 net_log_callback = base::Bind(NetLogProcTaskFailedCallback, |
741 attempt_number, | 745 attempt_number, error, os_error); |
742 error, | |
743 os_error); | |
744 } else { | 746 } else { |
745 net_log_callback = NetLog::IntegerCallback("attempt_number", | 747 net_log_callback = NetLog::IntegerCallback("attempt_number", |
746 attempt_number); | 748 attempt_number); |
747 } | 749 } |
748 net_log_.AddEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_ATTEMPT_FINISHED, | 750 net_log_.AddEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_ATTEMPT_FINISHED, |
749 net_log_callback); | 751 net_log_callback); |
750 | 752 |
751 if (was_completed()) | 753 if (was_completed()) |
752 return; | 754 return; |
753 | 755 |
754 // Copy the results from the first worker thread that resolves the host. | 756 // Copy the results from the first worker thread that resolves the host. |
755 results_ = results; | 757 results_ = results; |
756 completed_attempt_number_ = attempt_number; | 758 completed_attempt_number_ = attempt_number; |
757 completed_attempt_error_ = error; | 759 completed_attempt_error_ = error; |
758 | 760 |
759 if (was_retry_attempt) { | 761 if (was_retry_attempt) { |
760 // If retry attempt finishes before 1st attempt, then get stats on how | 762 // If retry attempt finishes before 1st attempt, then get stats on how |
761 // much time is saved by having spawned an extra attempt. | 763 // much time is saved by having spawned an extra attempt. |
762 retry_attempt_finished_time_ = base::TimeTicks::Now(); | 764 retry_attempt_finished_time_ = base::TimeTicks::Now(); |
763 } | 765 } |
764 | 766 |
765 if (error != OK) { | 767 if (error != OK) { |
766 net_log_callback = base::Bind(&NetLogProcTaskFailedCallback, | 768 net_log_callback = |
767 0, error, os_error); | 769 base::Bind(NetLogProcTaskFailedCallback, 0, error, os_error); |
768 } else { | 770 } else { |
769 net_log_callback = results_.CreateNetLogCallback(); | 771 net_log_callback = results_.CreateNetLogCallback(); |
770 } | 772 } |
771 net_log_.EndEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_PROC_TASK, | 773 net_log_.EndEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_PROC_TASK, |
772 net_log_callback); | 774 net_log_callback); |
773 | 775 |
774 callback_.Run(error, results_); | 776 callback_.Run(error, results_); |
775 } | 777 } |
776 | 778 |
777 void RecordPerformanceHistograms(const base::TimeTicks& start_time, | 779 void RecordPerformanceHistograms(const base::TimeTicks& start_time, |
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1160 return; | 1162 return; |
1161 } | 1163 } |
1162 | 1164 |
1163 OnSuccess(addr_list); | 1165 OnSuccess(addr_list); |
1164 } | 1166 } |
1165 | 1167 |
1166 void OnFailure(int net_error, DnsResponse::Result result) { | 1168 void OnFailure(int net_error, DnsResponse::Result result) { |
1167 DCHECK_NE(OK, net_error); | 1169 DCHECK_NE(OK, net_error); |
1168 net_log_.EndEvent( | 1170 net_log_.EndEvent( |
1169 NetLog::TYPE_HOST_RESOLVER_IMPL_DNS_TASK, | 1171 NetLog::TYPE_HOST_RESOLVER_IMPL_DNS_TASK, |
1170 base::Bind(&NetLogDnsTaskFailedCallback, net_error, result)); | 1172 base::Bind(NetLogDnsTaskFailedCallback, net_error, result)); |
1171 delegate_->OnDnsTaskComplete(task_start_time_, net_error, AddressList(), | 1173 delegate_->OnDnsTaskComplete(task_start_time_, net_error, AddressList(), |
1172 base::TimeDelta()); | 1174 base::TimeDelta()); |
1173 } | 1175 } |
1174 | 1176 |
1175 void OnSuccess(const AddressList& addr_list) { | 1177 void OnSuccess(const AddressList& addr_list) { |
1176 net_log_.EndEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_DNS_TASK, | 1178 net_log_.EndEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_DNS_TASK, |
1177 addr_list.CreateNetLogCallback()); | 1179 addr_list.CreateNetLogCallback()); |
1178 delegate_->OnDnsTaskComplete(task_start_time_, OK, addr_list, ttl_); | 1180 delegate_->OnDnsTaskComplete(task_start_time_, OK, addr_list, ttl_); |
1179 } | 1181 } |
1180 | 1182 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1218 had_non_speculative_request_(false), | 1220 had_non_speculative_request_(false), |
1219 had_dns_config_(false), | 1221 had_dns_config_(false), |
1220 num_occupied_job_slots_(0), | 1222 num_occupied_job_slots_(0), |
1221 dns_task_error_(OK), | 1223 dns_task_error_(OK), |
1222 creation_time_(base::TimeTicks::Now()), | 1224 creation_time_(base::TimeTicks::Now()), |
1223 priority_change_time_(creation_time_), | 1225 priority_change_time_(creation_time_), |
1224 net_log_(BoundNetLog::Make(source_net_log.net_log(), | 1226 net_log_(BoundNetLog::Make(source_net_log.net_log(), |
1225 NetLog::SOURCE_HOST_RESOLVER_IMPL_JOB)) { | 1227 NetLog::SOURCE_HOST_RESOLVER_IMPL_JOB)) { |
1226 source_net_log.AddEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_CREATE_JOB); | 1228 source_net_log.AddEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_CREATE_JOB); |
1227 | 1229 |
1228 net_log_.BeginEvent( | 1230 net_log_.BeginEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_JOB, |
1229 NetLog::TYPE_HOST_RESOLVER_IMPL_JOB, | 1231 base::Bind(NetLogJobCreationCallback, |
1230 base::Bind(&NetLogJobCreationCallback, | 1232 source_net_log.source(), &key_.hostname)); |
1231 source_net_log.source(), | |
1232 &key_.hostname)); | |
1233 } | 1233 } |
1234 | 1234 |
1235 ~Job() override { | 1235 ~Job() override { |
1236 if (is_running()) { | 1236 if (is_running()) { |
1237 // |resolver_| was destroyed with this Job still in flight. | 1237 // |resolver_| was destroyed with this Job still in flight. |
1238 // Clean-up, record in the log, but don't run any callbacks. | 1238 // Clean-up, record in the log, but don't run any callbacks. |
1239 if (is_proc_running()) { | 1239 if (is_proc_running()) { |
1240 proc_task_->Cancel(); | 1240 proc_task_->Cancel(); |
1241 proc_task_ = NULL; | 1241 proc_task_ = NULL; |
1242 } | 1242 } |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1291 DCHECK_EQ(key_.hostname, req->info().hostname()); | 1291 DCHECK_EQ(key_.hostname, req->info().hostname()); |
1292 } | 1292 } |
1293 | 1293 |
1294 req->set_job(this); | 1294 req->set_job(this); |
1295 priority_tracker_.Add(req->priority()); | 1295 priority_tracker_.Add(req->priority()); |
1296 | 1296 |
1297 req->source_net_log().AddEvent( | 1297 req->source_net_log().AddEvent( |
1298 NetLog::TYPE_HOST_RESOLVER_IMPL_JOB_ATTACH, | 1298 NetLog::TYPE_HOST_RESOLVER_IMPL_JOB_ATTACH, |
1299 net_log_.source().ToEventParametersCallback()); | 1299 net_log_.source().ToEventParametersCallback()); |
1300 | 1300 |
1301 net_log_.AddEvent( | 1301 net_log_.AddEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_JOB_REQUEST_ATTACH, |
1302 NetLog::TYPE_HOST_RESOLVER_IMPL_JOB_REQUEST_ATTACH, | 1302 base::Bind(NetLogJobAttachCallback, |
1303 base::Bind(&NetLogJobAttachCallback, | 1303 req->source_net_log().source(), priority())); |
1304 req->source_net_log().source(), | |
1305 priority())); | |
1306 | 1304 |
1307 // TODO(szym): Check if this is still needed. | 1305 // TODO(szym): Check if this is still needed. |
1308 if (!req->info().is_speculative()) { | 1306 if (!req->info().is_speculative()) { |
1309 had_non_speculative_request_ = true; | 1307 had_non_speculative_request_ = true; |
1310 if (proc_task_.get()) | 1308 if (proc_task_.get()) |
1311 proc_task_->set_had_non_speculative_request(); | 1309 proc_task_->set_had_non_speculative_request(); |
1312 } | 1310 } |
1313 | 1311 |
1314 requests_.push_back(req.release()); | 1312 requests_.push_back(req.release()); |
1315 | 1313 |
1316 UpdatePriority(); | 1314 UpdatePriority(); |
1317 } | 1315 } |
1318 | 1316 |
1319 // Marks |req| as cancelled. If it was the last active Request, also finishes | 1317 // Marks |req| as cancelled. If it was the last active Request, also finishes |
1320 // this Job, marking it as cancelled, and deletes it. | 1318 // this Job, marking it as cancelled, and deletes it. |
1321 void CancelRequest(Request* req) { | 1319 void CancelRequest(Request* req) { |
1322 DCHECK_EQ(key_.hostname, req->info().hostname()); | 1320 DCHECK_EQ(key_.hostname, req->info().hostname()); |
1323 DCHECK(!req->was_canceled()); | 1321 DCHECK(!req->was_canceled()); |
1324 | 1322 |
1325 // Don't remove it from |requests_| just mark it canceled. | 1323 // Don't remove it from |requests_| just mark it canceled. |
1326 req->MarkAsCanceled(); | 1324 req->MarkAsCanceled(); |
1327 LogCancelRequest(req->source_net_log(), req->info()); | 1325 LogCancelRequest(req->source_net_log(), req->info()); |
1328 | 1326 |
1329 priority_tracker_.Remove(req->priority()); | 1327 priority_tracker_.Remove(req->priority()); |
1330 net_log_.AddEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_JOB_REQUEST_DETACH, | 1328 net_log_.AddEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_JOB_REQUEST_DETACH, |
1331 base::Bind(&NetLogJobAttachCallback, | 1329 base::Bind(NetLogJobAttachCallback, |
1332 req->source_net_log().source(), | 1330 req->source_net_log().source(), priority())); |
1333 priority())); | |
1334 | 1331 |
1335 if (num_active_requests() > 0) { | 1332 if (num_active_requests() > 0) { |
1336 UpdatePriority(); | 1333 UpdatePriority(); |
1337 } else { | 1334 } else { |
1338 // If we were called from a Request's callback within CompleteRequests, | 1335 // If we were called from a Request's callback within CompleteRequests, |
1339 // that Request could not have been cancelled, so num_active_requests() | 1336 // that Request could not have been cancelled, so num_active_requests() |
1340 // could not be 0. Therefore, we are not in CompleteRequests(). | 1337 // could not be 0. Therefore, we are not in CompleteRequests(). |
1341 CompleteRequestsWithError(OK /* cancelled */); | 1338 CompleteRequestsWithError(OK /* cancelled */); |
1342 } | 1339 } |
1343 } | 1340 } |
(...skipping 671 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2015 } else if (!enabled && dns_client_) { | 2012 } else if (!enabled && dns_client_) { |
2016 SetDnsClient(scoped_ptr<DnsClient>()); | 2013 SetDnsClient(scoped_ptr<DnsClient>()); |
2017 } | 2014 } |
2018 #endif | 2015 #endif |
2019 } | 2016 } |
2020 | 2017 |
2021 HostCache* HostResolverImpl::GetHostCache() { | 2018 HostCache* HostResolverImpl::GetHostCache() { |
2022 return cache_.get(); | 2019 return cache_.get(); |
2023 } | 2020 } |
2024 | 2021 |
2025 base::Value* HostResolverImpl::GetDnsConfigAsValue() const { | 2022 scoped_ptr<base::Value> HostResolverImpl::GetDnsConfigAsValue() const { |
2026 // Check if async DNS is disabled. | 2023 // Check if async DNS is disabled. |
2027 if (!dns_client_.get()) | 2024 if (!dns_client_.get()) |
2028 return NULL; | 2025 return NULL; |
2029 | 2026 |
2030 // Check if async DNS is enabled, but we currently have no configuration | 2027 // Check if async DNS is enabled, but we currently have no configuration |
2031 // for it. | 2028 // for it. |
2032 const DnsConfig* dns_config = dns_client_->GetConfig(); | 2029 const DnsConfig* dns_config = dns_client_->GetConfig(); |
2033 if (dns_config == NULL) | 2030 if (dns_config == NULL) { |
2034 return new base::DictionaryValue(); | 2031 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
| 2032 return dict.Pass(); |
| 2033 } |
2035 | 2034 |
2036 return dns_config->ToValue(); | 2035 return dns_config->ToValue(); |
2037 } | 2036 } |
2038 | 2037 |
2039 bool HostResolverImpl::ResolveAsIP(const Key& key, | 2038 bool HostResolverImpl::ResolveAsIP(const Key& key, |
2040 const RequestInfo& info, | 2039 const RequestInfo& info, |
2041 const IPAddressNumber* ip_number, | 2040 const IPAddressNumber* ip_number, |
2042 int* net_error, | 2041 int* net_error, |
2043 AddressList* addresses) { | 2042 AddressList* addresses) { |
2044 DCHECK(addresses); | 2043 DCHECK(addresses); |
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2296 | 2295 |
2297 void HostResolverImpl::OnDNSChanged() { | 2296 void HostResolverImpl::OnDNSChanged() { |
2298 UpdateDNSConfig(true); | 2297 UpdateDNSConfig(true); |
2299 } | 2298 } |
2300 | 2299 |
2301 void HostResolverImpl::UpdateDNSConfig(bool config_changed) { | 2300 void HostResolverImpl::UpdateDNSConfig(bool config_changed) { |
2302 DnsConfig dns_config; | 2301 DnsConfig dns_config; |
2303 NetworkChangeNotifier::GetDnsConfig(&dns_config); | 2302 NetworkChangeNotifier::GetDnsConfig(&dns_config); |
2304 | 2303 |
2305 if (net_log_) { | 2304 if (net_log_) { |
2306 net_log_->AddGlobalEntry( | 2305 net_log_->AddGlobalEntry(NetLog::TYPE_DNS_CONFIG_CHANGED, |
2307 NetLog::TYPE_DNS_CONFIG_CHANGED, | 2306 base::Bind(NetLogDnsConfigCallback, &dns_config)); |
2308 base::Bind(&NetLogDnsConfigCallback, &dns_config)); | |
2309 } | 2307 } |
2310 | 2308 |
2311 // TODO(szym): Remove once http://crbug.com/137914 is resolved. | 2309 // TODO(szym): Remove once http://crbug.com/137914 is resolved. |
2312 received_dns_config_ = dns_config.IsValid(); | 2310 received_dns_config_ = dns_config.IsValid(); |
2313 // Conservatively assume local IPv6 is needed when DnsConfig is not valid. | 2311 // Conservatively assume local IPv6 is needed when DnsConfig is not valid. |
2314 use_local_ipv6_ = !dns_config.IsValid() || dns_config.use_local_ipv6; | 2312 use_local_ipv6_ = !dns_config.IsValid() || dns_config.use_local_ipv6; |
2315 | 2313 |
2316 num_dns_failures_ = 0; | 2314 num_dns_failures_ = 0; |
2317 | 2315 |
2318 // We want a new DnsSession in place, before we Abort running Jobs, so that | 2316 // We want a new DnsSession in place, before we Abort running Jobs, so that |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2392 dns_client_->SetConfig(dns_config); | 2390 dns_client_->SetConfig(dns_config); |
2393 num_dns_failures_ = 0; | 2391 num_dns_failures_ = 0; |
2394 if (dns_client_->GetConfig()) | 2392 if (dns_client_->GetConfig()) |
2395 UMA_HISTOGRAM_BOOLEAN("AsyncDNS.DnsClientEnabled", true); | 2393 UMA_HISTOGRAM_BOOLEAN("AsyncDNS.DnsClientEnabled", true); |
2396 } | 2394 } |
2397 | 2395 |
2398 AbortDnsTasks(); | 2396 AbortDnsTasks(); |
2399 } | 2397 } |
2400 | 2398 |
2401 } // namespace net | 2399 } // namespace net |
OLD | NEW |