Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(49)

Side by Side Diff: chrome/browser/net/http_server_properties_manager.cc

Issue 188663002: Revert of HttpServerProperties - Implement MRU for AlternateProtocolMap. Persist (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 "chrome/browser/net/http_server_properties_manager.h" 5 #include "chrome/browser/net/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/stl_util.h" 10 #include "base/stl_util.h"
(...skipping 25 matching lines...) Expand all
36 36
37 // "version" 0 indicates, http_server_properties doesn't have "version" 37 // "version" 0 indicates, http_server_properties doesn't have "version"
38 // property. 38 // property.
39 const int kMissingVersion = 0; 39 const int kMissingVersion = 0;
40 40
41 // The version number of persisted http_server_properties. 41 // The version number of persisted http_server_properties.
42 const int kVersionNumber = 2; 42 const int kVersionNumber = 2;
43 43
44 typedef std::vector<std::string> StringVector; 44 typedef std::vector<std::string> StringVector;
45 45
46 // Persist 200 MRU AlternateProtocolHostPortPairs.
47 const int kMaxAlternateProtocolHostsToPersist = 200;
48
49 } // namespace 46 } // namespace
50 47
51 //////////////////////////////////////////////////////////////////////////////// 48 ////////////////////////////////////////////////////////////////////////////////
52 // HttpServerPropertiesManager 49 // HttpServerPropertiesManager
53 50
54 HttpServerPropertiesManager::HttpServerPropertiesManager( 51 HttpServerPropertiesManager::HttpServerPropertiesManager(
55 PrefService* pref_service) 52 PrefService* pref_service)
56 : pref_service_(pref_service), 53 : pref_service_(pref_service),
57 setting_prefs_(false) { 54 setting_prefs_(false) {
58 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 55 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 void HttpServerPropertiesManager::SetSupportsSpdy( 141 void HttpServerPropertiesManager::SetSupportsSpdy(
145 const net::HostPortPair& server, 142 const net::HostPortPair& server,
146 bool support_spdy) { 143 bool support_spdy) {
147 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 144 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
148 145
149 http_server_properties_impl_->SetSupportsSpdy(server, support_spdy); 146 http_server_properties_impl_->SetSupportsSpdy(server, support_spdy);
150 ScheduleUpdatePrefsOnIO(); 147 ScheduleUpdatePrefsOnIO();
151 } 148 }
152 149
153 bool HttpServerPropertiesManager::HasAlternateProtocol( 150 bool HttpServerPropertiesManager::HasAlternateProtocol(
154 const net::HostPortPair& server) { 151 const net::HostPortPair& server) const {
155 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 152 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
156 return http_server_properties_impl_->HasAlternateProtocol(server); 153 return http_server_properties_impl_->HasAlternateProtocol(server);
157 } 154 }
158 155
159 net::PortAlternateProtocolPair 156 net::PortAlternateProtocolPair
160 HttpServerPropertiesManager::GetAlternateProtocol( 157 HttpServerPropertiesManager::GetAlternateProtocol(
161 const net::HostPortPair& server) { 158 const net::HostPortPair& server) const {
162 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 159 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
163 return http_server_properties_impl_->GetAlternateProtocol(server); 160 return http_server_properties_impl_->GetAlternateProtocol(server);
164 } 161 }
165 162
166 void HttpServerPropertiesManager::SetAlternateProtocol( 163 void HttpServerPropertiesManager::SetAlternateProtocol(
167 const net::HostPortPair& server, 164 const net::HostPortPair& server,
168 uint16 alternate_port, 165 uint16 alternate_port,
169 net::AlternateProtocol alternate_protocol) { 166 net::AlternateProtocol alternate_protocol) {
170 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 167 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
171 http_server_properties_impl_->SetAlternateProtocol( 168 http_server_properties_impl_->SetAlternateProtocol(
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
316 DVLOG(1) << "Size is too large. Clearing all properties."; 313 DVLOG(1) << "Size is too large. Clearing all properties.";
317 return; 314 return;
318 } 315 }
319 316
320 // String is host/port pair of spdy server. 317 // String is host/port pair of spdy server.
321 scoped_ptr<StringVector> spdy_servers(new StringVector); 318 scoped_ptr<StringVector> spdy_servers(new StringVector);
322 scoped_ptr<net::SpdySettingsMap> spdy_settings_map(new net::SpdySettingsMap); 319 scoped_ptr<net::SpdySettingsMap> spdy_settings_map(new net::SpdySettingsMap);
323 scoped_ptr<net::PipelineCapabilityMap> pipeline_capability_map( 320 scoped_ptr<net::PipelineCapabilityMap> pipeline_capability_map(
324 new net::PipelineCapabilityMap); 321 new net::PipelineCapabilityMap);
325 scoped_ptr<net::AlternateProtocolMap> alternate_protocol_map( 322 scoped_ptr<net::AlternateProtocolMap> alternate_protocol_map(
326 new net::AlternateProtocolMap(kMaxAlternateProtocolHostsToPersist)); 323 new net::AlternateProtocolMap);
327 324
328 for (base::DictionaryValue::Iterator it(*servers_dict); !it.IsAtEnd(); 325 for (base::DictionaryValue::Iterator it(*servers_dict); !it.IsAtEnd();
329 it.Advance()) { 326 it.Advance()) {
330 // Get server's host/pair. 327 // Get server's host/pair.
331 const std::string& server_str = it.key(); 328 const std::string& server_str = it.key();
332 net::HostPortPair server = net::HostPortPair::FromString(server_str); 329 net::HostPortPair server = net::HostPortPair::FromString(server_str);
333 if (server.host().empty()) { 330 if (server.host().empty()) {
334 DVLOG(1) << "Malformed http_server_properties for server: " << server_str; 331 DVLOG(1) << "Malformed http_server_properties for server: " << server_str;
335 detected_corrupted_prefs = true; 332 detected_corrupted_prefs = true;
336 continue; 333 continue;
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
382 379
383 int pipeline_capability = net::PIPELINE_UNKNOWN; 380 int pipeline_capability = net::PIPELINE_UNKNOWN;
384 if ((server_pref_dict->GetInteger( 381 if ((server_pref_dict->GetInteger(
385 "pipeline_capability", &pipeline_capability)) && 382 "pipeline_capability", &pipeline_capability)) &&
386 pipeline_capability != net::PIPELINE_UNKNOWN) { 383 pipeline_capability != net::PIPELINE_UNKNOWN) {
387 (*pipeline_capability_map)[server] = 384 (*pipeline_capability_map)[server] =
388 static_cast<net::HttpPipelinedHostCapability>(pipeline_capability); 385 static_cast<net::HttpPipelinedHostCapability>(pipeline_capability);
389 } 386 }
390 387
391 // Get alternate_protocol server. 388 // Get alternate_protocol server.
392 DCHECK(alternate_protocol_map->Peek(server) == 389 DCHECK(!ContainsKey(*alternate_protocol_map, server));
393 alternate_protocol_map->end());
394 const base::DictionaryValue* port_alternate_protocol_dict = NULL; 390 const base::DictionaryValue* port_alternate_protocol_dict = NULL;
395 if (!server_pref_dict->GetDictionaryWithoutPathExpansion( 391 if (!server_pref_dict->GetDictionaryWithoutPathExpansion(
396 "alternate_protocol", &port_alternate_protocol_dict)) { 392 "alternate_protocol", &port_alternate_protocol_dict)) {
397 continue; 393 continue;
398 } 394 }
399 395
400 do { 396 do {
401 int port = 0; 397 int port = 0;
402 if (!port_alternate_protocol_dict->GetIntegerWithoutPathExpansion( 398 if (!port_alternate_protocol_dict->GetIntegerWithoutPathExpansion(
403 "port", &port) || (port > (1 << 16))) { 399 "port", &port) || (port > (1 << 16))) {
(...skipping 13 matching lines...) Expand all
417 if (!net::IsAlternateProtocolValid(protocol)) { 413 if (!net::IsAlternateProtocolValid(protocol)) {
418 DVLOG(1) << "Malformed Alternate-Protocol server: " << server_str; 414 DVLOG(1) << "Malformed Alternate-Protocol server: " << server_str;
419 detected_corrupted_prefs = true; 415 detected_corrupted_prefs = true;
420 continue; 416 continue;
421 } 417 }
422 418
423 net::PortAlternateProtocolPair port_alternate_protocol; 419 net::PortAlternateProtocolPair port_alternate_protocol;
424 port_alternate_protocol.port = port; 420 port_alternate_protocol.port = port;
425 port_alternate_protocol.protocol = protocol; 421 port_alternate_protocol.protocol = protocol;
426 422
427 alternate_protocol_map->Put(server, port_alternate_protocol); 423 (*alternate_protocol_map)[server] = port_alternate_protocol;
428 } while (false); 424 } while (false);
429 } 425 }
430 426
431 BrowserThread::PostTask( 427 BrowserThread::PostTask(
432 BrowserThread::IO, 428 BrowserThread::IO,
433 FROM_HERE, 429 FROM_HERE,
434 base::Bind(&HttpServerPropertiesManager:: 430 base::Bind(&HttpServerPropertiesManager::
435 UpdateCacheFromPrefsOnIO, 431 UpdateCacheFromPrefsOnIO,
436 base::Unretained(this), 432 base::Unretained(this),
437 base::Owned(spdy_servers.release()), 433 base::Owned(spdy_servers.release()),
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
506 const base::Closure& completion) { 502 const base::Closure& completion) {
507 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 503 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
508 504
509 base::ListValue* spdy_server_list = new base::ListValue; 505 base::ListValue* spdy_server_list = new base::ListValue;
510 http_server_properties_impl_->GetSpdyServerList(spdy_server_list); 506 http_server_properties_impl_->GetSpdyServerList(spdy_server_list);
511 507
512 net::SpdySettingsMap* spdy_settings_map = new net::SpdySettingsMap; 508 net::SpdySettingsMap* spdy_settings_map = new net::SpdySettingsMap;
513 *spdy_settings_map = http_server_properties_impl_->spdy_settings_map(); 509 *spdy_settings_map = http_server_properties_impl_->spdy_settings_map();
514 510
515 net::AlternateProtocolMap* alternate_protocol_map = 511 net::AlternateProtocolMap* alternate_protocol_map =
516 new net::AlternateProtocolMap(kMaxAlternateProtocolHostsToPersist); 512 new net::AlternateProtocolMap;
517 const net::AlternateProtocolMap& map = 513 *alternate_protocol_map =
518 http_server_properties_impl_->alternate_protocol_map(); 514 http_server_properties_impl_->alternate_protocol_map();
519 int count = 0;
520 for (net::AlternateProtocolMap::const_iterator it = map.begin();
521 it != map.end() && count < kMaxAlternateProtocolHostsToPersist;
522 ++it, ++count) {
523 alternate_protocol_map->Put(it->first, it->second);
524 }
525 515
526 net::PipelineCapabilityMap* pipeline_capability_map = 516 net::PipelineCapabilityMap* pipeline_capability_map =
527 new net::PipelineCapabilityMap; 517 new net::PipelineCapabilityMap;
528 *pipeline_capability_map = 518 *pipeline_capability_map =
529 http_server_properties_impl_->GetPipelineCapabilityMap(); 519 http_server_properties_impl_->GetPipelineCapabilityMap();
530 520
531 // Update the preferences on the UI thread. 521 // Update the preferences on the UI thread.
532 BrowserThread::PostTask( 522 BrowserThread::PostTask(
533 BrowserThread::UI, 523 BrowserThread::UI,
534 FROM_HERE, 524 FROM_HERE,
(...skipping 30 matching lines...) Expand all
565 net::HttpPipelinedHostCapability pipeline_capability; 555 net::HttpPipelinedHostCapability pipeline_capability;
566 }; 556 };
567 557
568 void HttpServerPropertiesManager::UpdatePrefsOnUI( 558 void HttpServerPropertiesManager::UpdatePrefsOnUI(
569 base::ListValue* spdy_server_list, 559 base::ListValue* spdy_server_list,
570 net::SpdySettingsMap* spdy_settings_map, 560 net::SpdySettingsMap* spdy_settings_map,
571 net::AlternateProtocolMap* alternate_protocol_map, 561 net::AlternateProtocolMap* alternate_protocol_map,
572 net::PipelineCapabilityMap* pipeline_capability_map, 562 net::PipelineCapabilityMap* pipeline_capability_map,
573 const base::Closure& completion) { 563 const base::Closure& completion) {
574 564
575 // TODO(rtenneti): Fix ServerPrefMap to preserve MRU order of
576 // alternate_protocol_map and pipeline_capability_map.
577 typedef std::map<net::HostPortPair, ServerPref> ServerPrefMap; 565 typedef std::map<net::HostPortPair, ServerPref> ServerPrefMap;
578 ServerPrefMap server_pref_map; 566 ServerPrefMap server_pref_map;
579 567
580 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 568 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
581 569
582 // Add servers that support spdy to server_pref_map. 570 // Add servers that support spdy to server_pref_map.
583 std::string s; 571 std::string s;
584 for (base::ListValue::const_iterator list_it = spdy_server_list->begin(); 572 for (base::ListValue::const_iterator list_it = spdy_server_list->begin();
585 list_it != spdy_server_list->end(); ++list_it) { 573 list_it != spdy_server_list->end(); ++list_it) {
586 if ((*list_it)->GetAsString(&s)) { 574 if ((*list_it)->GetAsString(&s)) {
587 net::HostPortPair server = net::HostPortPair::FromString(s); 575 net::HostPortPair server = net::HostPortPair::FromString(s);
588 576
589 ServerPrefMap::iterator it = server_pref_map.find(server); 577 ServerPrefMap::iterator it = server_pref_map.find(server);
590 if (it == server_pref_map.end()) { 578 if (it == server_pref_map.end()) {
591 ServerPref server_pref(true, NULL, NULL); 579 ServerPref server_pref(true, NULL, NULL);
592 server_pref_map[server] = server_pref; 580 server_pref_map[server] = server_pref;
593 } else { 581 } else {
594 it->second.supports_spdy = true; 582 it->second.supports_spdy = true;
595 } 583 }
596 } 584 }
597 } 585 }
598 586
599 // Add servers that have SpdySettings to server_pref_map. 587 // Add servers that have SpdySettings to server_pref_map.
600 for (net::SpdySettingsMap::iterator map_it = spdy_settings_map->begin(); 588 for (net::SpdySettingsMap::iterator map_it =
589 spdy_settings_map->begin();
601 map_it != spdy_settings_map->end(); ++map_it) { 590 map_it != spdy_settings_map->end(); ++map_it) {
602 const net::HostPortPair& server = map_it->first; 591 const net::HostPortPair& server = map_it->first;
603 592
604 ServerPrefMap::iterator it = server_pref_map.find(server); 593 ServerPrefMap::iterator it = server_pref_map.find(server);
605 if (it == server_pref_map.end()) { 594 if (it == server_pref_map.end()) {
606 ServerPref server_pref(false, &map_it->second, NULL); 595 ServerPref server_pref(false, &map_it->second, NULL);
607 server_pref_map[server] = server_pref; 596 server_pref_map[server] = server_pref;
608 } else { 597 } else {
609 it->second.settings_map = &map_it->second; 598 it->second.settings_map = &map_it->second;
610 } 599 }
611 } 600 }
612 601
613 // Add AlternateProtocol servers to server_pref_map. 602 // Add AlternateProtocol servers to server_pref_map.
614 for (net::AlternateProtocolMap::const_iterator map_it = 603 for (net::AlternateProtocolMap::const_iterator map_it =
615 alternate_protocol_map->begin(); 604 alternate_protocol_map->begin();
616 map_it != alternate_protocol_map->end(); ++map_it) { 605 map_it != alternate_protocol_map->end(); ++map_it) {
617 const net::HostPortPair& server = map_it->first; 606 const net::HostPortPair& server = map_it->first;
618 const net::PortAlternateProtocolPair& port_alternate_protocol = 607 const net::PortAlternateProtocolPair& port_alternate_protocol =
619 map_it->second; 608 map_it->second;
620 if (!net::IsAlternateProtocolValid(port_alternate_protocol.protocol)) { 609 if (!net::IsAlternateProtocolValid(port_alternate_protocol.protocol)) {
621 continue; 610 continue;
622 } 611 }
623 612
624 ServerPrefMap::iterator it = server_pref_map.find(server); 613 ServerPrefMap::iterator it = server_pref_map.find(server);
625 if (it == server_pref_map.end()) { 614 if (it == server_pref_map.end()) {
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
713 completion.Run(); 702 completion.Run();
714 } 703 }
715 704
716 void HttpServerPropertiesManager::OnHttpServerPropertiesChanged() { 705 void HttpServerPropertiesManager::OnHttpServerPropertiesChanged() {
717 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 706 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
718 if (!setting_prefs_) 707 if (!setting_prefs_)
719 ScheduleUpdateCacheOnUI(); 708 ScheduleUpdateCacheOnUI();
720 } 709 }
721 710
722 } // namespace chrome_browser_net 711 } // namespace chrome_browser_net
OLDNEW
« no previous file with comments | « chrome/browser/net/http_server_properties_manager.h ('k') | net/http/http_network_transaction_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698