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/rand_util.h" | |
11 #include "base/single_thread_task_runner.h" | 10 #include "base/single_thread_task_runner.h" |
12 #include "base/stl_util.h" | 11 #include "base/stl_util.h" |
13 #include "base/strings/string_number_conversions.h" | 12 #include "base/strings/string_number_conversions.h" |
14 #include "base/strings/stringprintf.h" | 13 #include "base/strings/stringprintf.h" |
15 #include "base/thread_task_runner_handle.h" | 14 #include "base/thread_task_runner_handle.h" |
16 #include "base/values.h" | 15 #include "base/values.h" |
17 | 16 |
18 namespace net { | 17 namespace net { |
19 | 18 |
20 namespace { | 19 namespace { |
(...skipping 16 matching lines...) Expand all Loading... |
37 | 36 |
38 // "version" 0 indicates, http_server_properties doesn't have "version" | 37 // "version" 0 indicates, http_server_properties doesn't have "version" |
39 // property. | 38 // property. |
40 const int kMissingVersion = 0; | 39 const int kMissingVersion = 0; |
41 | 40 |
42 // The version number of persisted http_server_properties. | 41 // The version number of persisted http_server_properties. |
43 const int kVersionNumber = 3; | 42 const int kVersionNumber = 3; |
44 | 43 |
45 typedef std::vector<std::string> StringVector; | 44 typedef std::vector<std::string> StringVector; |
46 | 45 |
47 // Load either 200 or 1000 servers based on a coin flip. | 46 // Persist 200 MRU AlternateProtocolHostPortPairs. |
48 const int k200AlternateProtocolHostsToLoad = 200; | 47 const int kMaxAlternateProtocolHostsToPersist = 200; |
49 const int k1000AlternateProtocolHostsToLoad = 1000; | |
50 // Persist 1000 MRU AlternateProtocolHostPortPairs. | |
51 const int kMaxAlternateProtocolHostsToPersist = 1000; | |
52 | 48 |
53 // Persist 200 MRU SpdySettingsHostPortPairs. | 49 // Persist 200 MRU SpdySettingsHostPortPairs. |
54 const int kMaxSpdySettingsHostsToPersist = 200; | 50 const int kMaxSpdySettingsHostsToPersist = 200; |
55 | 51 |
56 // Persist 300 MRU SupportsSpdyServerHostPortPairs. | 52 // Persist 300 MRU SupportsSpdyServerHostPortPairs. |
57 const int kMaxSupportsSpdyServerHostsToPersist = 300; | 53 const int kMaxSupportsSpdyServerHostsToPersist = 300; |
58 | 54 |
59 } // namespace | 55 } // namespace |
60 | 56 |
61 //////////////////////////////////////////////////////////////////////////////// | 57 //////////////////////////////////////////////////////////////////////////////// |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
206 http_server_properties_impl_->ClearAlternateProtocol(server); | 202 http_server_properties_impl_->ClearAlternateProtocol(server); |
207 ScheduleUpdatePrefsOnNetworkThread(); | 203 ScheduleUpdatePrefsOnNetworkThread(); |
208 } | 204 } |
209 | 205 |
210 const net::AlternateProtocolMap& | 206 const net::AlternateProtocolMap& |
211 HttpServerPropertiesManager::alternate_protocol_map() const { | 207 HttpServerPropertiesManager::alternate_protocol_map() const { |
212 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); | 208 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); |
213 return http_server_properties_impl_->alternate_protocol_map(); | 209 return http_server_properties_impl_->alternate_protocol_map(); |
214 } | 210 } |
215 | 211 |
216 void HttpServerPropertiesManager::SetAlternateProtocolExperiment( | |
217 AlternateProtocolExperiment experiment) { | |
218 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); | |
219 http_server_properties_impl_->SetAlternateProtocolExperiment(experiment); | |
220 } | |
221 | |
222 void HttpServerPropertiesManager::SetAlternateProtocolProbabilityThreshold( | 212 void HttpServerPropertiesManager::SetAlternateProtocolProbabilityThreshold( |
223 double threshold) { | 213 double threshold) { |
224 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); | 214 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); |
225 http_server_properties_impl_->SetAlternateProtocolProbabilityThreshold( | 215 http_server_properties_impl_->SetAlternateProtocolProbabilityThreshold( |
226 threshold); | 216 threshold); |
227 } | 217 } |
228 | 218 |
229 AlternateProtocolExperiment | |
230 HttpServerPropertiesManager::GetAlternateProtocolExperiment() const { | |
231 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); | |
232 return http_server_properties_impl_->GetAlternateProtocolExperiment(); | |
233 } | |
234 | |
235 const SettingsMap& HttpServerPropertiesManager::GetSpdySettings( | 219 const SettingsMap& HttpServerPropertiesManager::GetSpdySettings( |
236 const HostPortPair& host_port_pair) { | 220 const HostPortPair& host_port_pair) { |
237 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); | 221 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); |
238 return http_server_properties_impl_->GetSpdySettings(host_port_pair); | 222 return http_server_properties_impl_->GetSpdySettings(host_port_pair); |
239 } | 223 } |
240 | 224 |
241 bool HttpServerPropertiesManager::SetSpdySetting( | 225 bool HttpServerPropertiesManager::SetSpdySetting( |
242 const HostPortPair& host_port_pair, | 226 const HostPortPair& host_port_pair, |
243 SpdySettingsIds id, | 227 SpdySettingsIds id, |
244 SpdySettingsFlags flags, | 228 SpdySettingsFlags flags, |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
356 } | 340 } |
357 | 341 |
358 // String is host/port pair of spdy server. | 342 // String is host/port pair of spdy server. |
359 scoped_ptr<StringVector> spdy_servers(new StringVector); | 343 scoped_ptr<StringVector> spdy_servers(new StringVector); |
360 scoped_ptr<net::SpdySettingsMap> spdy_settings_map( | 344 scoped_ptr<net::SpdySettingsMap> spdy_settings_map( |
361 new net::SpdySettingsMap(kMaxSpdySettingsHostsToPersist)); | 345 new net::SpdySettingsMap(kMaxSpdySettingsHostsToPersist)); |
362 scoped_ptr<net::AlternateProtocolMap> alternate_protocol_map( | 346 scoped_ptr<net::AlternateProtocolMap> alternate_protocol_map( |
363 new net::AlternateProtocolMap(kMaxAlternateProtocolHostsToPersist)); | 347 new net::AlternateProtocolMap(kMaxAlternateProtocolHostsToPersist)); |
364 scoped_ptr<net::SupportsQuicMap> supports_quic_map( | 348 scoped_ptr<net::SupportsQuicMap> supports_quic_map( |
365 new net::SupportsQuicMap()); | 349 new net::SupportsQuicMap()); |
366 // TODO(rtenneti): Delete the following code after the experiment. | |
367 int alternate_protocols_to_load = k200AlternateProtocolHostsToLoad; | |
368 net::AlternateProtocolExperiment alternate_protocol_experiment = | |
369 net::ALTERNATE_PROTOCOL_NOT_PART_OF_EXPERIMENT; | |
370 if (version == kVersionNumber) { | |
371 if (base::RandInt(0, 99) == 0) { | |
372 alternate_protocol_experiment = | |
373 net::ALTERNATE_PROTOCOL_TRUNCATED_200_SERVERS; | |
374 } else { | |
375 alternate_protocols_to_load = k1000AlternateProtocolHostsToLoad; | |
376 alternate_protocol_experiment = | |
377 net::ALTERNATE_PROTOCOL_TRUNCATED_1000_SERVERS; | |
378 } | |
379 DVLOG(1) << "# of servers that support alternate_protocol: " | |
380 << alternate_protocols_to_load; | |
381 } | |
382 | 350 |
383 int count = 0; | 351 int count = 0; |
384 for (base::DictionaryValue::Iterator it(*servers_dict); !it.IsAtEnd(); | 352 for (base::DictionaryValue::Iterator it(*servers_dict); !it.IsAtEnd(); |
385 it.Advance()) { | 353 it.Advance()) { |
386 // Get server's host/pair. | 354 // Get server's host/pair. |
387 const std::string& server_str = it.key(); | 355 const std::string& server_str = it.key(); |
388 net::HostPortPair server = net::HostPortPair::FromString(server_str); | 356 net::HostPortPair server = net::HostPortPair::FromString(server_str); |
389 if (server.host().empty()) { | 357 if (server.host().empty()) { |
390 DVLOG(1) << "Malformed http_server_properties for server: " << server_str; | 358 DVLOG(1) << "Malformed http_server_properties for server: " << server_str; |
391 detected_corrupted_prefs = true; | 359 detected_corrupted_prefs = true; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
438 | 406 |
439 // Get alternate_protocol server. | 407 // Get alternate_protocol server. |
440 DCHECK(alternate_protocol_map->Peek(server) == | 408 DCHECK(alternate_protocol_map->Peek(server) == |
441 alternate_protocol_map->end()); | 409 alternate_protocol_map->end()); |
442 const base::DictionaryValue* port_alternate_protocol_dict = NULL; | 410 const base::DictionaryValue* port_alternate_protocol_dict = NULL; |
443 if (!server_pref_dict->GetDictionaryWithoutPathExpansion( | 411 if (!server_pref_dict->GetDictionaryWithoutPathExpansion( |
444 "alternate_protocol", &port_alternate_protocol_dict)) { | 412 "alternate_protocol", &port_alternate_protocol_dict)) { |
445 continue; | 413 continue; |
446 } | 414 } |
447 | 415 |
448 if (count >= alternate_protocols_to_load) | 416 if (count >= kMaxAlternateProtocolHostsToPersist) |
449 continue; | 417 continue; |
450 do { | 418 do { |
451 int port = 0; | 419 int port = 0; |
452 if (!port_alternate_protocol_dict->GetIntegerWithoutPathExpansion( | 420 if (!port_alternate_protocol_dict->GetIntegerWithoutPathExpansion( |
453 "port", &port) || | 421 "port", &port) || |
454 (port > (1 << 16))) { | 422 (port > (1 << 16))) { |
455 DVLOG(1) << "Malformed Alternate-Protocol server: " << server_str; | 423 DVLOG(1) << "Malformed Alternate-Protocol server: " << server_str; |
456 detected_corrupted_prefs = true; | 424 detected_corrupted_prefs = true; |
457 continue; | 425 continue; |
458 } | 426 } |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
515 } | 483 } |
516 | 484 |
517 network_task_runner_->PostTask( | 485 network_task_runner_->PostTask( |
518 FROM_HERE, | 486 FROM_HERE, |
519 base::Bind( | 487 base::Bind( |
520 &HttpServerPropertiesManager::UpdateCacheFromPrefsOnNetworkThread, | 488 &HttpServerPropertiesManager::UpdateCacheFromPrefsOnNetworkThread, |
521 base::Unretained(this), | 489 base::Unretained(this), |
522 base::Owned(spdy_servers.release()), | 490 base::Owned(spdy_servers.release()), |
523 base::Owned(spdy_settings_map.release()), | 491 base::Owned(spdy_settings_map.release()), |
524 base::Owned(alternate_protocol_map.release()), | 492 base::Owned(alternate_protocol_map.release()), |
525 alternate_protocol_experiment, | |
526 base::Owned(supports_quic_map.release()), | 493 base::Owned(supports_quic_map.release()), |
527 detected_corrupted_prefs)); | 494 detected_corrupted_prefs)); |
528 } | 495 } |
529 | 496 |
530 void HttpServerPropertiesManager::UpdateCacheFromPrefsOnNetworkThread( | 497 void HttpServerPropertiesManager::UpdateCacheFromPrefsOnNetworkThread( |
531 StringVector* spdy_servers, | 498 StringVector* spdy_servers, |
532 net::SpdySettingsMap* spdy_settings_map, | 499 net::SpdySettingsMap* spdy_settings_map, |
533 net::AlternateProtocolMap* alternate_protocol_map, | 500 net::AlternateProtocolMap* alternate_protocol_map, |
534 net::AlternateProtocolExperiment alternate_protocol_experiment, | |
535 net::SupportsQuicMap* supports_quic_map, | 501 net::SupportsQuicMap* supports_quic_map, |
536 bool detected_corrupted_prefs) { | 502 bool detected_corrupted_prefs) { |
537 // Preferences have the master data because admins might have pushed new | 503 // Preferences have the master data because admins might have pushed new |
538 // preferences. Update the cached data with new data from preferences. | 504 // preferences. Update the cached data with new data from preferences. |
539 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); | 505 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); |
540 | 506 |
541 UMA_HISTOGRAM_COUNTS("Net.CountOfSpdyServers", spdy_servers->size()); | 507 UMA_HISTOGRAM_COUNTS("Net.CountOfSpdyServers", spdy_servers->size()); |
542 http_server_properties_impl_->InitializeSpdyServers(spdy_servers, true); | 508 http_server_properties_impl_->InitializeSpdyServers(spdy_servers, true); |
543 | 509 |
544 // Update the cached data and use the new spdy_settings from preferences. | 510 // Update the cached data and use the new spdy_settings from preferences. |
545 UMA_HISTOGRAM_COUNTS("Net.CountOfSpdySettings", spdy_settings_map->size()); | 511 UMA_HISTOGRAM_COUNTS("Net.CountOfSpdySettings", spdy_settings_map->size()); |
546 http_server_properties_impl_->InitializeSpdySettingsServers( | 512 http_server_properties_impl_->InitializeSpdySettingsServers( |
547 spdy_settings_map); | 513 spdy_settings_map); |
548 | 514 |
549 // Update the cached data and use the new Alternate-Protocol server list from | 515 // Update the cached data and use the new Alternate-Protocol server list from |
550 // preferences. | 516 // preferences. |
551 UMA_HISTOGRAM_COUNTS("Net.CountOfAlternateProtocolServers", | 517 UMA_HISTOGRAM_COUNTS("Net.CountOfAlternateProtocolServers", |
552 alternate_protocol_map->size()); | 518 alternate_protocol_map->size()); |
553 http_server_properties_impl_->InitializeAlternateProtocolServers( | 519 http_server_properties_impl_->InitializeAlternateProtocolServers( |
554 alternate_protocol_map); | 520 alternate_protocol_map); |
555 http_server_properties_impl_->SetAlternateProtocolExperiment( | |
556 alternate_protocol_experiment); | |
557 | 521 |
558 http_server_properties_impl_->InitializeSupportsQuic(supports_quic_map); | 522 http_server_properties_impl_->InitializeSupportsQuic(supports_quic_map); |
559 | 523 |
560 // Update the prefs with what we have read (delete all corrupted prefs). | 524 // Update the prefs with what we have read (delete all corrupted prefs). |
561 if (detected_corrupted_prefs) | 525 if (detected_corrupted_prefs) |
562 ScheduleUpdatePrefsOnNetworkThread(); | 526 ScheduleUpdatePrefsOnNetworkThread(); |
563 } | 527 } |
564 | 528 |
565 // | 529 // |
566 // Update Preferences with data from the cached data. | 530 // Update Preferences with data from the cached data. |
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
825 completion.Run(); | 789 completion.Run(); |
826 } | 790 } |
827 | 791 |
828 void HttpServerPropertiesManager::OnHttpServerPropertiesChanged() { | 792 void HttpServerPropertiesManager::OnHttpServerPropertiesChanged() { |
829 DCHECK(pref_task_runner_->RunsTasksOnCurrentThread()); | 793 DCHECK(pref_task_runner_->RunsTasksOnCurrentThread()); |
830 if (!setting_prefs_) | 794 if (!setting_prefs_) |
831 ScheduleUpdateCacheOnPrefThread(); | 795 ScheduleUpdateCacheOnPrefThread(); |
832 } | 796 } |
833 | 797 |
834 } // namespace net | 798 } // namespace net |
OLD | NEW |