Chromium Code Reviews| Index: net/http/http_server_properties_manager.cc |
| diff --git a/net/http/http_server_properties_manager.cc b/net/http/http_server_properties_manager.cc |
| index 873c8ca700faae8a9b1b39de9e47877d9000828b..6973e0b31780b98732c2785ea60e096628da20a5 100644 |
| --- a/net/http/http_server_properties_manager.cc |
| +++ b/net/http/http_server_properties_manager.cc |
| @@ -146,14 +146,13 @@ void HttpServerPropertiesManager::SetSupportsSpdy(const HostPortPair& server, |
| ScheduleUpdatePrefsOnNetworkThread(); |
| } |
| -bool HttpServerPropertiesManager::RequiresHTTP11( |
| - const net::HostPortPair& server) { |
| +bool HttpServerPropertiesManager::RequiresHTTP11(const HostPortPair& server) { |
| DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); |
| return http_server_properties_impl_->RequiresHTTP11(server); |
| } |
| void HttpServerPropertiesManager::SetHTTP11Required( |
| - const net::HostPortPair& server) { |
| + const HostPortPair& server) { |
| DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); |
| http_server_properties_impl_->SetHTTP11Required(server); |
| @@ -172,41 +171,46 @@ bool HttpServerPropertiesManager::HasAlternateProtocol( |
| return http_server_properties_impl_->HasAlternateProtocol(server); |
| } |
| -AlternateProtocolInfo HttpServerPropertiesManager::GetAlternateProtocol( |
| +const AlternateProtocols& HttpServerPropertiesManager::GetAlternateProtocols( |
| const HostPortPair& server) { |
| DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); |
| - return http_server_properties_impl_->GetAlternateProtocol(server); |
| + return http_server_properties_impl_->GetAlternateProtocols(server); |
| } |
| -void HttpServerPropertiesManager::SetAlternateProtocol( |
| +void HttpServerPropertiesManager::AddAlternateProtocol( |
| const HostPortPair& server, |
| uint16 alternate_port, |
| AlternateProtocol alternate_protocol, |
| double alternate_probability) { |
| DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); |
| - http_server_properties_impl_->SetAlternateProtocol( |
| + http_server_properties_impl_->AddAlternateProtocol( |
| server, alternate_port, alternate_protocol, alternate_probability); |
| ScheduleUpdatePrefsOnNetworkThread(); |
| } |
| void HttpServerPropertiesManager::SetBrokenAlternateProtocol( |
| - const HostPortPair& server) { |
| + const HostPortPair& server, |
| + const AlternateProtocolInfo& broken_alternate_protocol) { |
| DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); |
| - http_server_properties_impl_->SetBrokenAlternateProtocol(server); |
| + http_server_properties_impl_->SetBrokenAlternateProtocol( |
| + server, broken_alternate_protocol); |
| ScheduleUpdatePrefsOnNetworkThread(); |
| } |
| bool HttpServerPropertiesManager::WasAlternateProtocolRecentlyBroken( |
| - const HostPortPair& server) { |
| + const HostPortPair& server, |
| + const AlternateProtocolInfo& alternate_protocol) { |
| DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); |
| return http_server_properties_impl_->WasAlternateProtocolRecentlyBroken( |
| - server); |
| + server, alternate_protocol); |
| } |
| void HttpServerPropertiesManager::ConfirmAlternateProtocol( |
| - const HostPortPair& server) { |
| + const HostPortPair& server, |
| + const AlternateProtocolInfo& alternate_protocol) { |
| DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); |
| - http_server_properties_impl_->ConfirmAlternateProtocol(server); |
| + http_server_properties_impl_->ConfirmAlternateProtocol(server, |
| + alternate_protocol); |
| ScheduleUpdatePrefsOnNetworkThread(); |
| } |
| @@ -217,6 +221,22 @@ void HttpServerPropertiesManager::ClearAlternateProtocol( |
| ScheduleUpdatePrefsOnNetworkThread(); |
| } |
| +void HttpServerPropertiesManager::ClearNonBrokenAlternateProtocols( |
| + const HostPortPair& server) { |
| + DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); |
| + http_server_properties_impl_->ClearNonBrokenAlternateProtocols(server); |
| + ScheduleUpdatePrefsOnNetworkThread(); |
| +} |
| + |
| +void HttpServerPropertiesManager::RemoveAlternateProtocol( |
| + const HostPortPair& server, |
| + const AlternateProtocolInfo& alternate_protocol) { |
| + DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); |
| + http_server_properties_impl_->RemoveAlternateProtocol(server, |
| + alternate_protocol); |
| + ScheduleUpdatePrefsOnNetworkThread(); |
| +} |
| + |
| const AlternateProtocolMap& |
| HttpServerPropertiesManager::alternate_protocol_map() const { |
| DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); |
| @@ -422,46 +442,102 @@ void HttpServerPropertiesManager::UpdateCacheFromPrefsOnPrefThread() { |
| spdy_settings_map->Put(server, settings_map); |
| } |
| - // Get alternate_protocol server. |
| + // Get alternative_services... |
| DCHECK(alternate_protocol_map->Peek(server) == |
| alternate_protocol_map->end()); |
| - const base::DictionaryValue* port_alternate_protocol_dict = NULL; |
| - if (server_pref_dict->GetDictionaryWithoutPathExpansion( |
| - "alternate_protocol", &port_alternate_protocol_dict)) { |
| - int port = 0; |
| - if (!port_alternate_protocol_dict->GetIntegerWithoutPathExpansion( |
| - "port", &port) || |
| - !IsPortValid(port)) { |
| - DVLOG(1) << "Malformed Alternate-Protocol server: " << server_str; |
| - detected_corrupted_prefs = true; |
| - continue; |
| - } |
| - std::string protocol_str; |
| - if (!port_alternate_protocol_dict->GetStringWithoutPathExpansion( |
| - "protocol_str", &protocol_str)) { |
| - DVLOG(1) << "Malformed Alternate-Protocol server: " << server_str; |
| - detected_corrupted_prefs = true; |
| - continue; |
| - } |
| - AlternateProtocol protocol = AlternateProtocolFromString(protocol_str); |
| - if (!IsAlternateProtocolValid(protocol)) { |
| - DVLOG(1) << "Malformed Alternate-Protocol server: " << server_str; |
| - detected_corrupted_prefs = true; |
| - continue; |
| - } |
| + const base::ListValue* alternate_protocol_list = NULL; |
| + if (server_pref_dict->GetListWithoutPathExpansion( |
| + "alternative_services", &alternate_protocol_list) && |
| + !alternate_protocol_list->empty()) { |
| + AlternateProtocols alternate_protocols; |
| + for (const auto& alternate_protocol_list_item : |
| + *alternate_protocol_list) { |
| + base::DictionaryValue* alternate_protocol_dict; |
| + if (!alternate_protocol_list_item->GetAsDictionary( |
| + &alternate_protocol_dict)) |
| + continue; |
| + AlternateProtocolInfo alternate_protocol; |
| - double probability = 1; |
| - if (port_alternate_protocol_dict->HasKey("probability") && |
| - !port_alternate_protocol_dict->GetDoubleWithoutPathExpansion( |
| - "probability", &probability)) { |
| - DVLOG(1) << "Malformed Alternate-Protocol server: " << server_str; |
| - detected_corrupted_prefs = true; |
| - continue; |
| + int port = 0; |
| + if (!alternate_protocol_dict->GetInteger("port", &port) || |
| + !IsPortValid(port)) { |
| + DVLOG(1) << "Malformed AltSvc port for server: " << server_str; |
| + detected_corrupted_prefs = true; |
| + continue; |
| + } |
| + alternate_protocol.port = static_cast<uint16>(port); |
| + |
| + std::string protocol_str; |
| + if (!alternate_protocol_dict->GetStringWithoutPathExpansion( |
| + "protocol_str", &protocol_str)) { |
| + DVLOG(1) << "Malformed AltSvc protocol string for server: " |
| + << server_str; |
| + detected_corrupted_prefs = true; |
| + continue; |
| + } |
| + AlternateProtocol protocol = AlternateProtocolFromString(protocol_str); |
| + if (!IsAlternateProtocolValid(protocol)) { |
| + DVLOG(1) << "Invalid AltSvc protocol string for server: " |
| + << server_str; |
| + detected_corrupted_prefs = true; |
| + continue; |
| + } |
| + alternate_protocol.protocol = AlternateProtocolFromString(protocol_str); |
| + |
| + double probability = 1; |
| + if (alternate_protocol_dict->HasKey("probability") && |
| + !alternate_protocol_dict->GetDoubleWithoutPathExpansion( |
| + "probability", &probability)) { |
| + DVLOG(1) << "Malformed AltSvc probability for server: " << server_str; |
| + detected_corrupted_prefs = true; |
| + continue; |
| + } |
| + alternate_protocol.probability = probability; |
| + |
| + alternate_protocols.push_back(alternate_protocol); |
| } |
| + alternate_protocol_map->Put(server, alternate_protocols); |
| + } else { |
| + // ...or alternate_protocol. |
|
Bence
2015/01/30 21:24:50
Do we need to be able to load old settings, or can
Ryan Hamilton
2015/01/30 21:50:19
We definitely want to support old settings. It loo
Bence
2015/02/06 19:59:40
Done.
|
| + const base::DictionaryValue* port_alternate_protocol_dict = NULL; |
| + if (server_pref_dict->GetDictionaryWithoutPathExpansion( |
| + "alternate_protocol", &port_alternate_protocol_dict)) { |
| + int port = 0; |
| + if (!port_alternate_protocol_dict->GetIntegerWithoutPathExpansion( |
| + "port", &port) || |
| + !IsPortValid(port)) { |
| + DVLOG(1) << "Malformed Alternate-Protocol server: " << server_str; |
| + detected_corrupted_prefs = true; |
| + continue; |
| + } |
| + std::string protocol_str; |
| + if (!port_alternate_protocol_dict->GetStringWithoutPathExpansion( |
| + "protocol_str", &protocol_str)) { |
| + DVLOG(1) << "Malformed Alternate-Protocol server: " << server_str; |
| + detected_corrupted_prefs = true; |
| + continue; |
| + } |
| + AlternateProtocol protocol = AlternateProtocolFromString(protocol_str); |
| + if (!IsAlternateProtocolValid(protocol)) { |
| + DVLOG(1) << "Malformed Alternate-Protocol server: " << server_str; |
| + detected_corrupted_prefs = true; |
| + continue; |
| + } |
| + |
| + double probability = 1; |
| + if (port_alternate_protocol_dict->HasKey("probability") && |
| + !port_alternate_protocol_dict->GetDoubleWithoutPathExpansion( |
| + "probability", &probability)) { |
| + DVLOG(1) << "Malformed Alternate-Protocol server: " << server_str; |
| + detected_corrupted_prefs = true; |
| + continue; |
| + } |
| - AlternateProtocolInfo port_alternate_protocol(static_cast<uint16>(port), |
| - protocol, probability); |
| - alternate_protocol_map->Put(server, port_alternate_protocol); |
| + AlternateProtocolInfo port_alternate_protocol(static_cast<uint16>(port), |
| + protocol, probability); |
| + alternate_protocol_map->Put( |
| + server, AlternateProtocols(/*size=*/1, port_alternate_protocol)); |
| + } |
| } |
| // Get SupportsQuic. |
| @@ -652,28 +728,28 @@ void HttpServerPropertiesManager::UpdatePrefsFromCacheOnNetworkThread( |
| } |
| // A local or temporary data structure to hold |supports_spdy|, SpdySettings, |
| -// AlternateProtocolInfo and SupportsQuic preferences for a server. This is used |
| +// AlternateProtocols and SupportsQuic preferences for a server. This is used |
| // only in UpdatePrefsOnPrefThread. |
| struct ServerPref { |
| ServerPref() |
| : supports_spdy(false), |
| settings_map(NULL), |
| - alternate_protocol(NULL), |
| + alternate_protocols(NULL), |
| supports_quic(NULL), |
| server_network_stats(NULL) {} |
| ServerPref(bool supports_spdy, |
| const SettingsMap* settings_map, |
| - const AlternateProtocolInfo* alternate_protocol, |
| + const AlternateProtocols* alternate_protocols, |
| const SupportsQuic* supports_quic, |
| const ServerNetworkStats* server_network_stats) |
| : supports_spdy(supports_spdy), |
| settings_map(settings_map), |
| - alternate_protocol(alternate_protocol), |
| + alternate_protocols(alternate_protocols), |
| supports_quic(supports_quic), |
| server_network_stats(server_network_stats) {} |
| bool supports_spdy; |
| const SettingsMap* settings_map; |
| - const AlternateProtocolInfo* alternate_protocol; |
| + const AlternateProtocols* alternate_protocols; |
| const SupportsQuic* supports_quic; |
| const ServerNetworkStats* server_network_stats; |
| }; |
| @@ -727,17 +803,12 @@ void HttpServerPropertiesManager::UpdatePrefsOnPrefThread( |
| alternate_protocol_map->begin(); |
| map_it != alternate_protocol_map->end(); ++map_it) { |
| const HostPortPair& server = map_it->first; |
| - const AlternateProtocolInfo& port_alternate_protocol = map_it->second; |
| - if (!IsAlternateProtocolValid(port_alternate_protocol.protocol)) { |
| - continue; |
| - } |
| - |
| ServerPrefMap::iterator it = server_pref_map.find(server); |
| if (it == server_pref_map.end()) { |
| ServerPref server_pref(false, NULL, &map_it->second, NULL, NULL); |
| server_pref_map[server] = server_pref; |
| } else { |
| - it->second.alternate_protocol = &map_it->second; |
| + it->second.alternate_protocols = &map_it->second; |
| } |
| } |
| @@ -798,21 +869,27 @@ void HttpServerPropertiesManager::UpdatePrefsOnPrefThread( |
| server_pref_dict->SetWithoutPathExpansion("settings", spdy_settings_dict); |
| } |
| - // Save alternate_protocol. |
| - const AlternateProtocolInfo* port_alternate_protocol = |
| - server_pref.alternate_protocol; |
| - if (port_alternate_protocol && !port_alternate_protocol->is_broken) { |
| - base::DictionaryValue* port_alternate_protocol_dict = |
| - new base::DictionaryValue; |
| - port_alternate_protocol_dict->SetInteger("port", |
| - port_alternate_protocol->port); |
| - const char* protocol_str = |
| - AlternateProtocolToString(port_alternate_protocol->protocol); |
| - port_alternate_protocol_dict->SetString("protocol_str", protocol_str); |
| - port_alternate_protocol_dict->SetDouble( |
| - "probability", port_alternate_protocol->probability); |
| - server_pref_dict->SetWithoutPathExpansion( |
| - "alternate_protocol", port_alternate_protocol_dict); |
| + // Save alternative_services. |
| + if (server_pref.alternate_protocols && |
| + server_pref.alternate_protocols->size() > 0) { |
| + base::ListValue* alternate_protocols_list = new base::ListValue; |
| + for (AlternateProtocols::const_iterator alternate_protocol = |
| + server_pref.alternate_protocols->begin(); |
| + alternate_protocol != server_pref.alternate_protocols->end(); |
| + ++alternate_protocol) { |
| + base::DictionaryValue* alternate_protocol_dict = |
| + new base::DictionaryValue; |
| + alternate_protocol_dict->SetInteger("port", alternate_protocol->port); |
| + alternate_protocol_dict->SetString("host", server.host()); |
| + alternate_protocol_dict->SetString( |
| + "protocol_str", |
| + AlternateProtocolToString(alternate_protocol->protocol)); |
| + alternate_protocol_dict->SetDouble("probability", |
| + alternate_protocol->probability); |
| + alternate_protocols_list->Append(alternate_protocol_dict); |
| + } |
| + server_pref_dict->SetWithoutPathExpansion("alternative_services", |
| + alternate_protocols_list); |
| } |
| // Save supports_quic. |