| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/http/http_server_properties_manager.h" | 5 #include "net/http/http_server_properties_manager.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/metrics/histogram.h" | 8 #include "base/metrics/histogram.h" |
| 9 #include "base/prefs/pref_service.h" | 9 #include "base/prefs/pref_service.h" |
| 10 #include "base/single_thread_task_runner.h" | 10 #include "base/single_thread_task_runner.h" |
| (...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 269 http_server_properties_impl_->ClearAllSpdySettings(); | 269 http_server_properties_impl_->ClearAllSpdySettings(); |
| 270 ScheduleUpdatePrefsOnNetworkThread(); | 270 ScheduleUpdatePrefsOnNetworkThread(); |
| 271 } | 271 } |
| 272 | 272 |
| 273 const SpdySettingsMap& HttpServerPropertiesManager::spdy_settings_map() | 273 const SpdySettingsMap& HttpServerPropertiesManager::spdy_settings_map() |
| 274 const { | 274 const { |
| 275 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); | 275 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); |
| 276 return http_server_properties_impl_->spdy_settings_map(); | 276 return http_server_properties_impl_->spdy_settings_map(); |
| 277 } | 277 } |
| 278 | 278 |
| 279 SupportsQuic HttpServerPropertiesManager::GetSupportsQuic( | 279 bool HttpServerPropertiesManager::GetSupportsQuic( |
| 280 const HostPortPair& host_port_pair) const { | 280 IPAddressNumber* last_address) const { |
| 281 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); | 281 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); |
| 282 return http_server_properties_impl_->GetSupportsQuic(host_port_pair); | 282 return http_server_properties_impl_->GetSupportsQuic(last_address); |
| 283 } | 283 } |
| 284 | 284 |
| 285 void HttpServerPropertiesManager::SetSupportsQuic( | 285 void HttpServerPropertiesManager::SetSupportsQuic( |
| 286 const HostPortPair& host_port_pair, | |
| 287 bool used_quic, | 286 bool used_quic, |
| 288 const std::string& address) { | 287 const IPAddressNumber& address) { |
| 289 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); | 288 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); |
| 290 http_server_properties_impl_->SetSupportsQuic( | 289 http_server_properties_impl_->SetSupportsQuic(used_quic, address); |
| 291 host_port_pair, used_quic, address); | |
| 292 ScheduleUpdatePrefsOnNetworkThread(); | 290 ScheduleUpdatePrefsOnNetworkThread(); |
| 293 } | 291 } |
| 294 | 292 |
| 295 const SupportsQuicMap& HttpServerPropertiesManager::supports_quic_map() | |
| 296 const { | |
| 297 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); | |
| 298 return http_server_properties_impl_->supports_quic_map(); | |
| 299 } | |
| 300 | |
| 301 void HttpServerPropertiesManager::SetServerNetworkStats( | 293 void HttpServerPropertiesManager::SetServerNetworkStats( |
| 302 const HostPortPair& host_port_pair, | 294 const HostPortPair& host_port_pair, |
| 303 ServerNetworkStats stats) { | 295 ServerNetworkStats stats) { |
| 304 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); | 296 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); |
| 305 http_server_properties_impl_->SetServerNetworkStats(host_port_pair, stats); | 297 http_server_properties_impl_->SetServerNetworkStats(host_port_pair, stats); |
| 306 ScheduleUpdatePrefsOnNetworkThread(); | 298 ScheduleUpdatePrefsOnNetworkThread(); |
| 307 } | 299 } |
| 308 | 300 |
| 309 const ServerNetworkStats* HttpServerPropertiesManager::GetServerNetworkStats( | 301 const ServerNetworkStats* HttpServerPropertiesManager::GetServerNetworkStats( |
| 310 const HostPortPair& host_port_pair) { | 302 const HostPortPair& host_port_pair) { |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 359 | 351 |
| 360 // The properties for a given server is in | 352 // The properties for a given server is in |
| 361 // http_server_properties_dict["servers"][server]. | 353 // http_server_properties_dict["servers"][server]. |
| 362 const base::DictionaryValue* servers_dict = NULL; | 354 const base::DictionaryValue* servers_dict = NULL; |
| 363 if (!http_server_properties_dict.GetDictionaryWithoutPathExpansion( | 355 if (!http_server_properties_dict.GetDictionaryWithoutPathExpansion( |
| 364 kServersKey, &servers_dict)) { | 356 kServersKey, &servers_dict)) { |
| 365 DVLOG(1) << "Malformed http_server_properties for servers."; | 357 DVLOG(1) << "Malformed http_server_properties for servers."; |
| 366 return; | 358 return; |
| 367 } | 359 } |
| 368 | 360 |
| 361 IPAddressNumber* addr = new IPAddressNumber; |
| 362 ReadSupportsQuic(http_server_properties_dict, addr); |
| 363 |
| 369 // String is host/port pair of spdy server. | 364 // String is host/port pair of spdy server. |
| 370 scoped_ptr<StringVector> spdy_servers(new StringVector); | 365 scoped_ptr<StringVector> spdy_servers(new StringVector); |
| 371 scoped_ptr<SpdySettingsMap> spdy_settings_map( | 366 scoped_ptr<SpdySettingsMap> spdy_settings_map( |
| 372 new SpdySettingsMap(kMaxSpdySettingsHostsToPersist)); | 367 new SpdySettingsMap(kMaxSpdySettingsHostsToPersist)); |
| 373 scoped_ptr<AlternateProtocolMap> alternate_protocol_map( | 368 scoped_ptr<AlternateProtocolMap> alternate_protocol_map( |
| 374 new AlternateProtocolMap(kMaxAlternateProtocolHostsToPersist)); | 369 new AlternateProtocolMap(kMaxAlternateProtocolHostsToPersist)); |
| 375 scoped_ptr<SupportsQuicMap> supports_quic_map(new SupportsQuicMap()); | |
| 376 scoped_ptr<ServerNetworkStatsMap> server_network_stats_map( | 370 scoped_ptr<ServerNetworkStatsMap> server_network_stats_map( |
| 377 new ServerNetworkStatsMap(kMaxServerNetworkStatsHostsToPersist)); | 371 new ServerNetworkStatsMap(kMaxServerNetworkStatsHostsToPersist)); |
| 378 | 372 |
| 379 for (base::DictionaryValue::Iterator it(*servers_dict); !it.IsAtEnd(); | 373 for (base::DictionaryValue::Iterator it(*servers_dict); !it.IsAtEnd(); |
| 380 it.Advance()) { | 374 it.Advance()) { |
| 381 // Get server's host/pair. | 375 // Get server's host/pair. |
| 382 const std::string& server_str = it.key(); | 376 const std::string& server_str = it.key(); |
| 383 HostPortPair server = HostPortPair::FromString(server_str); | 377 HostPortPair server = HostPortPair::FromString(server_str); |
| 384 if (server.host().empty()) { | 378 if (server.host().empty()) { |
| 385 DVLOG(1) << "Malformed http_server_properties for server: " << server_str; | 379 DVLOG(1) << "Malformed http_server_properties for server: " << server_str; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 397 // Get if server supports Spdy. | 391 // Get if server supports Spdy. |
| 398 bool supports_spdy = false; | 392 bool supports_spdy = false; |
| 399 if ((server_pref_dict->GetBoolean(kSupportsSpdyKey, &supports_spdy)) && | 393 if ((server_pref_dict->GetBoolean(kSupportsSpdyKey, &supports_spdy)) && |
| 400 supports_spdy) { | 394 supports_spdy) { |
| 401 spdy_servers->push_back(server_str); | 395 spdy_servers->push_back(server_str); |
| 402 } | 396 } |
| 403 | 397 |
| 404 AddToSpdySettingsMap(server, *server_pref_dict, spdy_settings_map.get()); | 398 AddToSpdySettingsMap(server, *server_pref_dict, spdy_settings_map.get()); |
| 405 if (!AddToAlternateProtocolMap(server, *server_pref_dict, | 399 if (!AddToAlternateProtocolMap(server, *server_pref_dict, |
| 406 alternate_protocol_map.get()) || | 400 alternate_protocol_map.get()) || |
| 407 !AddToSupportsQuicMap(server, *server_pref_dict, | |
| 408 supports_quic_map.get()) || | |
| 409 !AddToNetworkStatsMap(server, *server_pref_dict, | 401 !AddToNetworkStatsMap(server, *server_pref_dict, |
| 410 server_network_stats_map.get())) { | 402 server_network_stats_map.get())) { |
| 411 detected_corrupted_prefs = true; | 403 detected_corrupted_prefs = true; |
| 412 } | 404 } |
| 413 } | 405 } |
| 414 | 406 |
| 415 network_task_runner_->PostTask( | 407 network_task_runner_->PostTask( |
| 416 FROM_HERE, | 408 FROM_HERE, |
| 417 base::Bind( | 409 base::Bind( |
| 418 &HttpServerPropertiesManager::UpdateCacheFromPrefsOnNetworkThread, | 410 &HttpServerPropertiesManager::UpdateCacheFromPrefsOnNetworkThread, |
| 419 base::Unretained(this), base::Owned(spdy_servers.release()), | 411 base::Unretained(this), base::Owned(spdy_servers.release()), |
| 420 base::Owned(spdy_settings_map.release()), | 412 base::Owned(spdy_settings_map.release()), |
| 421 base::Owned(alternate_protocol_map.release()), | 413 base::Owned(alternate_protocol_map.release()), base::Owned(addr), |
| 422 base::Owned(supports_quic_map.release()), | |
| 423 base::Owned(server_network_stats_map.release()), | 414 base::Owned(server_network_stats_map.release()), |
| 424 detected_corrupted_prefs)); | 415 detected_corrupted_prefs)); |
| 425 } | 416 } |
| 426 | 417 |
| 427 void HttpServerPropertiesManager::AddToSpdySettingsMap( | 418 void HttpServerPropertiesManager::AddToSpdySettingsMap( |
| 428 const HostPortPair& server, | 419 const HostPortPair& server, |
| 429 const base::DictionaryValue& server_pref_dict, | 420 const base::DictionaryValue& server_pref_dict, |
| 430 SpdySettingsMap* spdy_settings_map) { | 421 SpdySettingsMap* spdy_settings_map) { |
| 431 // Get SpdySettings. | 422 // Get SpdySettings. |
| 432 DCHECK(spdy_settings_map->Peek(server) == spdy_settings_map->end()); | 423 DCHECK(spdy_settings_map->Peek(server) == spdy_settings_map->end()); |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 495 DVLOG(1) << "Malformed Alternate-Protocol server: " << server.ToString(); | 486 DVLOG(1) << "Malformed Alternate-Protocol server: " << server.ToString(); |
| 496 return false; | 487 return false; |
| 497 } | 488 } |
| 498 | 489 |
| 499 AlternateProtocolInfo port_alternate_protocol(static_cast<uint16>(port), | 490 AlternateProtocolInfo port_alternate_protocol(static_cast<uint16>(port), |
| 500 protocol, probability); | 491 protocol, probability); |
| 501 alternate_protocol_map->Put(server, port_alternate_protocol); | 492 alternate_protocol_map->Put(server, port_alternate_protocol); |
| 502 return true; | 493 return true; |
| 503 } | 494 } |
| 504 | 495 |
| 505 bool HttpServerPropertiesManager::AddToSupportsQuicMap( | 496 bool HttpServerPropertiesManager::ReadSupportsQuic( |
| 506 const HostPortPair& server, | 497 const base::DictionaryValue& http_server_properties_dict, |
| 507 const base::DictionaryValue& server_pref_dict, | 498 IPAddressNumber* last_quic_address) { |
| 508 SupportsQuicMap* supports_quic_map) { | |
| 509 DCHECK(supports_quic_map->find(server) == supports_quic_map->end()); | |
| 510 const base::DictionaryValue* supports_quic_dict = NULL; | 499 const base::DictionaryValue* supports_quic_dict = NULL; |
| 511 if (!server_pref_dict.GetDictionaryWithoutPathExpansion( | 500 if (!http_server_properties_dict.GetDictionaryWithoutPathExpansion( |
| 512 kSupportsQuicKey, &supports_quic_dict)) { | 501 kSupportsQuicKey, &supports_quic_dict)) { |
| 513 return true; | 502 return true; |
| 514 } | 503 } |
| 515 bool used_quic = 0; | 504 bool used_quic = false; |
| 516 if (!supports_quic_dict->GetBooleanWithoutPathExpansion(kUsedQuicKey, | 505 if (!supports_quic_dict->GetBooleanWithoutPathExpansion(kUsedQuicKey, |
| 517 &used_quic)) { | 506 &used_quic)) { |
| 518 DVLOG(1) << "Malformed SupportsQuic server: " << server.ToString(); | 507 DVLOG(1) << "Malformed SupportsQuic"; |
| 519 return false; | 508 return false; |
| 520 } | 509 } |
| 510 if (!used_quic) |
| 511 return false; |
| 512 |
| 521 std::string address; | 513 std::string address; |
| 522 if (!supports_quic_dict->GetStringWithoutPathExpansion(kAddressKey, | 514 if (!supports_quic_dict->GetStringWithoutPathExpansion(kAddressKey, |
| 523 &address)) { | 515 &address) || |
| 524 DVLOG(1) << "Malformed SupportsQuic server: " << server.ToString(); | 516 !ParseIPLiteralToNumber(address, last_quic_address)) { |
| 517 DVLOG(1) << "Malformed SupportsQuic"; |
| 525 return false; | 518 return false; |
| 526 } | 519 } |
| 527 SupportsQuic supports_quic(used_quic, address); | |
| 528 supports_quic_map->insert(std::make_pair(server, supports_quic)); | |
| 529 return true; | 520 return true; |
| 530 } | 521 } |
| 531 | 522 |
| 532 bool HttpServerPropertiesManager::AddToNetworkStatsMap( | 523 bool HttpServerPropertiesManager::AddToNetworkStatsMap( |
| 533 const HostPortPair& server, | 524 const HostPortPair& server, |
| 534 const base::DictionaryValue& server_pref_dict, | 525 const base::DictionaryValue& server_pref_dict, |
| 535 ServerNetworkStatsMap* network_stats_map) { | 526 ServerNetworkStatsMap* network_stats_map) { |
| 536 DCHECK(network_stats_map->Peek(server) == network_stats_map->end()); | 527 DCHECK(network_stats_map->Peek(server) == network_stats_map->end()); |
| 537 const base::DictionaryValue* server_network_stats_dict = NULL; | 528 const base::DictionaryValue* server_network_stats_dict = NULL; |
| 538 if (!server_pref_dict.GetDictionaryWithoutPathExpansion( | 529 if (!server_pref_dict.GetDictionaryWithoutPathExpansion( |
| (...skipping 12 matching lines...) Expand all Loading... |
| 551 // TODO(rtenneti): When QUIC starts using bandwidth_estimate, then persist | 542 // TODO(rtenneti): When QUIC starts using bandwidth_estimate, then persist |
| 552 // bandwidth_estimate. | 543 // bandwidth_estimate. |
| 553 network_stats_map->Put(server, server_network_stats); | 544 network_stats_map->Put(server, server_network_stats); |
| 554 return true; | 545 return true; |
| 555 } | 546 } |
| 556 | 547 |
| 557 void HttpServerPropertiesManager::UpdateCacheFromPrefsOnNetworkThread( | 548 void HttpServerPropertiesManager::UpdateCacheFromPrefsOnNetworkThread( |
| 558 StringVector* spdy_servers, | 549 StringVector* spdy_servers, |
| 559 SpdySettingsMap* spdy_settings_map, | 550 SpdySettingsMap* spdy_settings_map, |
| 560 AlternateProtocolMap* alternate_protocol_map, | 551 AlternateProtocolMap* alternate_protocol_map, |
| 561 SupportsQuicMap* supports_quic_map, | 552 IPAddressNumber* last_quic_address, |
| 562 ServerNetworkStatsMap* server_network_stats_map, | 553 ServerNetworkStatsMap* server_network_stats_map, |
| 563 bool detected_corrupted_prefs) { | 554 bool detected_corrupted_prefs) { |
| 564 // Preferences have the master data because admins might have pushed new | 555 // Preferences have the master data because admins might have pushed new |
| 565 // preferences. Update the cached data with new data from preferences. | 556 // preferences. Update the cached data with new data from preferences. |
| 566 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); | 557 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); |
| 567 | 558 |
| 568 UMA_HISTOGRAM_COUNTS("Net.CountOfSpdyServers", spdy_servers->size()); | 559 UMA_HISTOGRAM_COUNTS("Net.CountOfSpdyServers", spdy_servers->size()); |
| 569 http_server_properties_impl_->InitializeSpdyServers(spdy_servers, true); | 560 http_server_properties_impl_->InitializeSpdyServers(spdy_servers, true); |
| 570 | 561 |
| 571 // Update the cached data and use the new spdy_settings from preferences. | 562 // Update the cached data and use the new spdy_settings from preferences. |
| 572 UMA_HISTOGRAM_COUNTS("Net.CountOfSpdySettings", spdy_settings_map->size()); | 563 UMA_HISTOGRAM_COUNTS("Net.CountOfSpdySettings", spdy_settings_map->size()); |
| 573 http_server_properties_impl_->InitializeSpdySettingsServers( | 564 http_server_properties_impl_->InitializeSpdySettingsServers( |
| 574 spdy_settings_map); | 565 spdy_settings_map); |
| 575 | 566 |
| 576 // Update the cached data and use the new Alternate-Protocol server list from | 567 // Update the cached data and use the new Alternate-Protocol server list from |
| 577 // preferences. | 568 // preferences. |
| 578 UMA_HISTOGRAM_COUNTS("Net.CountOfAlternateProtocolServers", | 569 UMA_HISTOGRAM_COUNTS("Net.CountOfAlternateProtocolServers", |
| 579 alternate_protocol_map->size()); | 570 alternate_protocol_map->size()); |
| 580 http_server_properties_impl_->InitializeAlternateProtocolServers( | 571 http_server_properties_impl_->InitializeAlternateProtocolServers( |
| 581 alternate_protocol_map); | 572 alternate_protocol_map); |
| 582 | 573 |
| 583 http_server_properties_impl_->InitializeSupportsQuic(supports_quic_map); | 574 http_server_properties_impl_->InitializeSupportsQuic(last_quic_address); |
| 584 | 575 |
| 585 http_server_properties_impl_->InitializeServerNetworkStats( | 576 http_server_properties_impl_->InitializeServerNetworkStats( |
| 586 server_network_stats_map); | 577 server_network_stats_map); |
| 587 | 578 |
| 588 // Update the prefs with what we have read (delete all corrupted prefs). | 579 // Update the prefs with what we have read (delete all corrupted prefs). |
| 589 if (detected_corrupted_prefs) | 580 if (detected_corrupted_prefs) |
| 590 ScheduleUpdatePrefsOnNetworkThread(); | 581 ScheduleUpdatePrefsOnNetworkThread(); |
| 591 } | 582 } |
| 592 | 583 |
| 593 // | 584 // |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 650 http_server_properties_impl_->GetCanonicalSuffix(server.host()); | 641 http_server_properties_impl_->GetCanonicalSuffix(server.host()); |
| 651 if (!canonical_suffix.empty()) { | 642 if (!canonical_suffix.empty()) { |
| 652 if (persisted_map.find(canonical_suffix) != persisted_map.end()) | 643 if (persisted_map.find(canonical_suffix) != persisted_map.end()) |
| 653 continue; | 644 continue; |
| 654 persisted_map[canonical_suffix] = true; | 645 persisted_map[canonical_suffix] = true; |
| 655 } | 646 } |
| 656 alternate_protocol_map->Put(server, it->second); | 647 alternate_protocol_map->Put(server, it->second); |
| 657 ++count; | 648 ++count; |
| 658 } | 649 } |
| 659 | 650 |
| 660 SupportsQuicMap* supports_quic_map = new SupportsQuicMap(); | |
| 661 const SupportsQuicMap& main_supports_quic_map = | |
| 662 http_server_properties_impl_->supports_quic_map(); | |
| 663 for (SupportsQuicMap::const_iterator it = main_supports_quic_map.begin(); | |
| 664 it != main_supports_quic_map.end(); ++it) { | |
| 665 supports_quic_map->insert(std::make_pair(it->first, it->second)); | |
| 666 } | |
| 667 | |
| 668 ServerNetworkStatsMap* server_network_stats_map = | 651 ServerNetworkStatsMap* server_network_stats_map = |
| 669 new ServerNetworkStatsMap(kMaxServerNetworkStatsHostsToPersist); | 652 new ServerNetworkStatsMap(kMaxServerNetworkStatsHostsToPersist); |
| 670 const ServerNetworkStatsMap& main_server_network_stats_map = | 653 const ServerNetworkStatsMap& main_server_network_stats_map = |
| 671 http_server_properties_impl_->server_network_stats_map(); | 654 http_server_properties_impl_->server_network_stats_map(); |
| 672 for (ServerNetworkStatsMap::const_iterator it = | 655 for (ServerNetworkStatsMap::const_iterator it = |
| 673 main_server_network_stats_map.begin(); | 656 main_server_network_stats_map.begin(); |
| 674 it != main_server_network_stats_map.end(); ++it) { | 657 it != main_server_network_stats_map.end(); ++it) { |
| 675 server_network_stats_map->Put(it->first, it->second); | 658 server_network_stats_map->Put(it->first, it->second); |
| 676 } | 659 } |
| 677 | 660 |
| 661 IPAddressNumber* last_quic_addr = new IPAddressNumber; |
| 662 http_server_properties_impl_->GetSupportsQuic(last_quic_addr); |
| 678 // Update the preferences on the pref thread. | 663 // Update the preferences on the pref thread. |
| 679 pref_task_runner_->PostTask( | 664 pref_task_runner_->PostTask( |
| 680 FROM_HERE, | 665 FROM_HERE, |
| 681 base::Bind( | 666 base::Bind( |
| 682 &HttpServerPropertiesManager::UpdatePrefsOnPrefThread, pref_weak_ptr_, | 667 &HttpServerPropertiesManager::UpdatePrefsOnPrefThread, pref_weak_ptr_, |
| 683 base::Owned(spdy_server_list), base::Owned(spdy_settings_map), | 668 base::Owned(spdy_server_list), base::Owned(spdy_settings_map), |
| 684 base::Owned(alternate_protocol_map), base::Owned(supports_quic_map), | 669 base::Owned(alternate_protocol_map), base::Owned(last_quic_addr), |
| 685 base::Owned(server_network_stats_map), completion)); | 670 base::Owned(server_network_stats_map), completion)); |
| 686 } | 671 } |
| 687 | 672 |
| 688 // A local or temporary data structure to hold |supports_spdy|, SpdySettings, | 673 // A local or temporary data structure to hold |supports_spdy|, SpdySettings, |
| 689 // AlternateProtocolInfo and SupportsQuic preferences for a server. This is used | 674 // AlternateProtocolInfo and SupportsQuic preferences for a server. This is used |
| 690 // only in UpdatePrefsOnPrefThread. | 675 // only in UpdatePrefsOnPrefThread. |
| 691 struct ServerPref { | 676 struct ServerPref { |
| 692 ServerPref() | 677 ServerPref() |
| 693 : supports_spdy(false), | 678 : supports_spdy(false), |
| 694 settings_map(NULL), | 679 settings_map(NULL), |
| (...skipping 14 matching lines...) Expand all Loading... |
| 709 const SettingsMap* settings_map; | 694 const SettingsMap* settings_map; |
| 710 const AlternateProtocolInfo* alternate_protocol; | 695 const AlternateProtocolInfo* alternate_protocol; |
| 711 const SupportsQuic* supports_quic; | 696 const SupportsQuic* supports_quic; |
| 712 const ServerNetworkStats* server_network_stats; | 697 const ServerNetworkStats* server_network_stats; |
| 713 }; | 698 }; |
| 714 | 699 |
| 715 void HttpServerPropertiesManager::UpdatePrefsOnPrefThread( | 700 void HttpServerPropertiesManager::UpdatePrefsOnPrefThread( |
| 716 base::ListValue* spdy_server_list, | 701 base::ListValue* spdy_server_list, |
| 717 SpdySettingsMap* spdy_settings_map, | 702 SpdySettingsMap* spdy_settings_map, |
| 718 AlternateProtocolMap* alternate_protocol_map, | 703 AlternateProtocolMap* alternate_protocol_map, |
| 719 SupportsQuicMap* supports_quic_map, | 704 IPAddressNumber* last_quic_address, |
| 720 ServerNetworkStatsMap* server_network_stats_map, | 705 ServerNetworkStatsMap* server_network_stats_map, |
| 721 const base::Closure& completion) { | 706 const base::Closure& completion) { |
| 722 typedef std::map<HostPortPair, ServerPref> ServerPrefMap; | 707 typedef std::map<HostPortPair, ServerPref> ServerPrefMap; |
| 723 ServerPrefMap server_pref_map; | 708 ServerPrefMap server_pref_map; |
| 724 | 709 |
| 725 DCHECK(pref_task_runner_->RunsTasksOnCurrentThread()); | 710 DCHECK(pref_task_runner_->RunsTasksOnCurrentThread()); |
| 726 | 711 |
| 727 // Add servers that support spdy to server_pref_map. | 712 // Add servers that support spdy to server_pref_map. |
| 728 std::string s; | 713 std::string s; |
| 729 for (base::ListValue::const_iterator list_it = spdy_server_list->begin(); | 714 for (base::ListValue::const_iterator list_it = spdy_server_list->begin(); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 747 alternate_protocol_map->begin(); | 732 alternate_protocol_map->begin(); |
| 748 map_it != alternate_protocol_map->end(); ++map_it) { | 733 map_it != alternate_protocol_map->end(); ++map_it) { |
| 749 const HostPortPair& server = map_it->first; | 734 const HostPortPair& server = map_it->first; |
| 750 const AlternateProtocolInfo& port_alternate_protocol = map_it->second; | 735 const AlternateProtocolInfo& port_alternate_protocol = map_it->second; |
| 751 if (!IsAlternateProtocolValid(port_alternate_protocol.protocol)) { | 736 if (!IsAlternateProtocolValid(port_alternate_protocol.protocol)) { |
| 752 continue; | 737 continue; |
| 753 } | 738 } |
| 754 server_pref_map[server].alternate_protocol = &map_it->second; | 739 server_pref_map[server].alternate_protocol = &map_it->second; |
| 755 } | 740 } |
| 756 | 741 |
| 757 // Add SupportsQuic servers to server_pref_map. | |
| 758 for (SupportsQuicMap::const_iterator map_it = supports_quic_map->begin(); | |
| 759 map_it != supports_quic_map->end(); ++map_it) { | |
| 760 const HostPortPair& server = map_it->first; | |
| 761 server_pref_map[server].supports_quic = &map_it->second; | |
| 762 } | |
| 763 | |
| 764 // Add ServerNetworkStats servers to server_pref_map. | 742 // Add ServerNetworkStats servers to server_pref_map. |
| 765 for (ServerNetworkStatsMap::const_iterator map_it = | 743 for (ServerNetworkStatsMap::const_iterator map_it = |
| 766 server_network_stats_map->begin(); | 744 server_network_stats_map->begin(); |
| 767 map_it != server_network_stats_map->end(); ++map_it) { | 745 map_it != server_network_stats_map->end(); ++map_it) { |
| 768 const HostPortPair& server = map_it->first; | 746 const HostPortPair& server = map_it->first; |
| 769 server_pref_map[server].server_network_stats = &map_it->second; | 747 server_pref_map[server].server_network_stats = &map_it->second; |
| 770 } | 748 } |
| 771 | 749 |
| 772 // Persist properties to the |path_|. | 750 // Persist properties to the |path_|. |
| 773 base::DictionaryValue http_server_properties_dict; | 751 base::DictionaryValue http_server_properties_dict; |
| 774 base::DictionaryValue* servers_dict = new base::DictionaryValue; | 752 base::DictionaryValue* servers_dict = new base::DictionaryValue; |
| 775 for (ServerPrefMap::const_iterator map_it = server_pref_map.begin(); | 753 for (ServerPrefMap::const_iterator map_it = server_pref_map.begin(); |
| 776 map_it != server_pref_map.end(); | 754 map_it != server_pref_map.end(); |
| 777 ++map_it) { | 755 ++map_it) { |
| 778 const HostPortPair& server = map_it->first; | 756 const HostPortPair& server = map_it->first; |
| 779 const ServerPref& server_pref = map_it->second; | 757 const ServerPref& server_pref = map_it->second; |
| 780 | 758 |
| 781 base::DictionaryValue* server_pref_dict = new base::DictionaryValue; | 759 base::DictionaryValue* server_pref_dict = new base::DictionaryValue; |
| 782 | 760 |
| 783 // Save supports_spdy. | 761 // Save supports_spdy. |
| 784 if (server_pref.supports_spdy) | 762 if (server_pref.supports_spdy) |
| 785 server_pref_dict->SetBoolean(kSupportsSpdyKey, server_pref.supports_spdy); | 763 server_pref_dict->SetBoolean(kSupportsSpdyKey, server_pref.supports_spdy); |
| 786 SaveSpdySettingsToServerPrefs(server_pref.settings_map, server_pref_dict); | 764 SaveSpdySettingsToServerPrefs(server_pref.settings_map, server_pref_dict); |
| 787 SaveAlternateProtocolToServerPrefs(server_pref.alternate_protocol, | 765 SaveAlternateProtocolToServerPrefs(server_pref.alternate_protocol, |
| 788 server_pref_dict); | 766 server_pref_dict); |
| 789 SaveSupportsQuicToServerPrefs(server_pref.supports_quic, server_pref_dict); | |
| 790 SaveNetworkStatsToServerPrefs(server_pref.server_network_stats, | 767 SaveNetworkStatsToServerPrefs(server_pref.server_network_stats, |
| 791 server_pref_dict); | 768 server_pref_dict); |
| 792 | 769 |
| 793 servers_dict->SetWithoutPathExpansion(server.ToString(), server_pref_dict); | 770 servers_dict->SetWithoutPathExpansion(server.ToString(), server_pref_dict); |
| 794 } | 771 } |
| 795 | 772 |
| 796 http_server_properties_dict.SetWithoutPathExpansion(kServersKey, | 773 http_server_properties_dict.SetWithoutPathExpansion(kServersKey, |
| 797 servers_dict); | 774 servers_dict); |
| 798 SetVersion(&http_server_properties_dict, kVersionNumber); | 775 SetVersion(&http_server_properties_dict, kVersionNumber); |
| 776 |
| 777 SaveSupportsQuicToPrefs(last_quic_address, &http_server_properties_dict); |
| 778 |
| 799 setting_prefs_ = true; | 779 setting_prefs_ = true; |
| 800 pref_service_->Set(path_, http_server_properties_dict); | 780 pref_service_->Set(path_, http_server_properties_dict); |
| 801 setting_prefs_ = false; | 781 setting_prefs_ = false; |
| 802 | 782 |
| 803 // Note that |completion| will be fired after we have written everything to | 783 // Note that |completion| will be fired after we have written everything to |
| 804 // the Preferences, but likely before these changes are serialized to disk. | 784 // the Preferences, but likely before these changes are serialized to disk. |
| 805 // This is not a problem though, as JSONPrefStore guarantees that this will | 785 // This is not a problem though, as JSONPrefStore guarantees that this will |
| 806 // happen, pretty soon, and even in the case we shut down immediately. | 786 // happen, pretty soon, and even in the case we shut down immediately. |
| 807 if (!completion.is_null()) | 787 if (!completion.is_null()) |
| 808 completion.Run(); | 788 completion.Run(); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 837 port_alternate_protocol->port); | 817 port_alternate_protocol->port); |
| 838 const char* protocol_str = | 818 const char* protocol_str = |
| 839 AlternateProtocolToString(port_alternate_protocol->protocol); | 819 AlternateProtocolToString(port_alternate_protocol->protocol); |
| 840 port_alternate_protocol_dict->SetString(kProtocolKey, protocol_str); | 820 port_alternate_protocol_dict->SetString(kProtocolKey, protocol_str); |
| 841 port_alternate_protocol_dict->SetDouble(kProbabilityKey, | 821 port_alternate_protocol_dict->SetDouble(kProbabilityKey, |
| 842 port_alternate_protocol->probability); | 822 port_alternate_protocol->probability); |
| 843 server_pref_dict->SetWithoutPathExpansion(kAlternateProtocolKey, | 823 server_pref_dict->SetWithoutPathExpansion(kAlternateProtocolKey, |
| 844 port_alternate_protocol_dict); | 824 port_alternate_protocol_dict); |
| 845 } | 825 } |
| 846 | 826 |
| 847 void HttpServerPropertiesManager::SaveSupportsQuicToServerPrefs( | 827 void HttpServerPropertiesManager::SaveSupportsQuicToPrefs( |
| 848 const SupportsQuic* supports_quic, | 828 const IPAddressNumber* last_quic_address, |
| 849 base::DictionaryValue* server_pref_dict) { | 829 base::DictionaryValue* http_server_properties_dict) { |
| 850 // Save supports_quic. | 830 if (!last_quic_address || last_quic_address->empty()) |
| 851 if (!supports_quic) | |
| 852 return; | 831 return; |
| 853 | 832 |
| 854 base::DictionaryValue* supports_quic_dict = new base::DictionaryValue; | 833 base::DictionaryValue* supports_quic_dict = new base::DictionaryValue; |
| 855 supports_quic_dict->SetBoolean(kUsedQuicKey, supports_quic->used_quic); | 834 supports_quic_dict->SetBoolean(kUsedQuicKey, true); |
| 856 supports_quic_dict->SetString(kAddressKey, supports_quic->address); | 835 supports_quic_dict->SetString(kAddressKey, |
| 857 server_pref_dict->SetWithoutPathExpansion(kSupportsQuicKey, | 836 IPAddressToString(*last_quic_address)); |
| 858 supports_quic_dict); | 837 http_server_properties_dict->SetWithoutPathExpansion(kSupportsQuicKey, |
| 838 supports_quic_dict); |
| 859 } | 839 } |
| 860 | 840 |
| 861 void HttpServerPropertiesManager::SaveNetworkStatsToServerPrefs( | 841 void HttpServerPropertiesManager::SaveNetworkStatsToServerPrefs( |
| 862 const ServerNetworkStats* server_network_stats, | 842 const ServerNetworkStats* server_network_stats, |
| 863 base::DictionaryValue* server_pref_dict) { | 843 base::DictionaryValue* server_pref_dict) { |
| 864 if (!server_network_stats) | 844 if (!server_network_stats) |
| 865 return; | 845 return; |
| 866 | 846 |
| 867 base::DictionaryValue* server_network_stats_dict = new base::DictionaryValue; | 847 base::DictionaryValue* server_network_stats_dict = new base::DictionaryValue; |
| 868 // Becasue JSON doesn't support int64, persist int64 as a string. | 848 // Becasue JSON doesn't support int64, persist int64 as a string. |
| 869 server_network_stats_dict->SetInteger( | 849 server_network_stats_dict->SetInteger( |
| 870 kSrttKey, static_cast<int>(server_network_stats->srtt.ToInternalValue())); | 850 kSrttKey, static_cast<int>(server_network_stats->srtt.ToInternalValue())); |
| 871 // TODO(rtenneti): When QUIC starts using bandwidth_estimate, then persist | 851 // TODO(rtenneti): When QUIC starts using bandwidth_estimate, then persist |
| 872 // bandwidth_estimate. | 852 // bandwidth_estimate. |
| 873 server_pref_dict->SetWithoutPathExpansion(kNetworkStatsKey, | 853 server_pref_dict->SetWithoutPathExpansion(kNetworkStatsKey, |
| 874 server_network_stats_dict); | 854 server_network_stats_dict); |
| 875 } | 855 } |
| 876 | 856 |
| 877 void HttpServerPropertiesManager::OnHttpServerPropertiesChanged() { | 857 void HttpServerPropertiesManager::OnHttpServerPropertiesChanged() { |
| 878 DCHECK(pref_task_runner_->RunsTasksOnCurrentThread()); | 858 DCHECK(pref_task_runner_->RunsTasksOnCurrentThread()); |
| 879 if (!setting_prefs_) | 859 if (!setting_prefs_) |
| 880 ScheduleUpdateCacheOnPrefThread(); | 860 ScheduleUpdateCacheOnPrefThread(); |
| 881 } | 861 } |
| 882 | 862 |
| 883 } // namespace net | 863 } // namespace net |
| OLD | NEW |