| 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 <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
| (...skipping 569 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 580 DVLOG(1) << "Malformed alternative service protocol string for server: " | 580 DVLOG(1) << "Malformed alternative service protocol string for server: " |
| 581 << server_str; | 581 << server_str; |
| 582 return false; | 582 return false; |
| 583 } | 583 } |
| 584 NextProto protocol = NextProtoFromString(protocol_str); | 584 NextProto protocol = NextProtoFromString(protocol_str); |
| 585 if (!IsAlternateProtocolValid(protocol)) { | 585 if (!IsAlternateProtocolValid(protocol)) { |
| 586 DVLOG(1) << "Invalid alternative service protocol string for server: " | 586 DVLOG(1) << "Invalid alternative service protocol string for server: " |
| 587 << server_str; | 587 << server_str; |
| 588 return false; | 588 return false; |
| 589 } | 589 } |
| 590 alternative_service_info->alternative_service.protocol = protocol; | 590 alternative_service_info->set_protocol(protocol); |
| 591 | 591 |
| 592 // Host is optional, defaults to "". | 592 // Host is optional, defaults to "". |
| 593 alternative_service_info->alternative_service.host.clear(); | 593 std::string host = ""; |
| 594 if (alternative_service_dict.HasKey(kHostKey) && | 594 if (alternative_service_dict.HasKey(kHostKey) && |
| 595 !alternative_service_dict.GetStringWithoutPathExpansion( | 595 !alternative_service_dict.GetStringWithoutPathExpansion(kHostKey, |
| 596 kHostKey, &(alternative_service_info->alternative_service.host))) { | 596 &host)) { |
| 597 DVLOG(1) << "Malformed alternative service host string for server: " | 597 DVLOG(1) << "Malformed alternative service host string for server: " |
| 598 << server_str; | 598 << server_str; |
| 599 return false; | 599 return false; |
| 600 } | 600 } |
| 601 alternative_service_info->set_host(host); |
| 601 | 602 |
| 602 // Port is mandatory. | 603 // Port is mandatory. |
| 603 int port = 0; | 604 int port = 0; |
| 604 if (!alternative_service_dict.GetInteger(kPortKey, &port) || | 605 if (!alternative_service_dict.GetInteger(kPortKey, &port) || |
| 605 !IsPortValid(port)) { | 606 !IsPortValid(port)) { |
| 606 DVLOG(1) << "Malformed alternative service port for server: " << server_str; | 607 DVLOG(1) << "Malformed alternative service port for server: " << server_str; |
| 607 return false; | 608 return false; |
| 608 } | 609 } |
| 609 alternative_service_info->alternative_service.port = | 610 alternative_service_info->set_port(static_cast<uint32_t>(port)); |
| 610 static_cast<uint32_t>(port); | |
| 611 | 611 |
| 612 // Expiration is optional, defaults to one day. | 612 // Expiration is optional, defaults to one day. |
| 613 base::Time expiration; | 613 base::Time expiration; |
| 614 if (!alternative_service_dict.HasKey(kExpirationKey)) { | 614 if (!alternative_service_dict.HasKey(kExpirationKey)) { |
| 615 alternative_service_info->expiration = | 615 alternative_service_info->set_expiration(base::Time::Now() + |
| 616 base::Time::Now() + base::TimeDelta::FromDays(1); | 616 base::TimeDelta::FromDays(1)); |
| 617 return true; | 617 return true; |
| 618 } | 618 } |
| 619 | 619 |
| 620 std::string expiration_string; | 620 std::string expiration_string; |
| 621 if (alternative_service_dict.GetStringWithoutPathExpansion( | 621 if (alternative_service_dict.GetStringWithoutPathExpansion( |
| 622 kExpirationKey, &expiration_string)) { | 622 kExpirationKey, &expiration_string)) { |
| 623 int64_t expiration_int64 = 0; | 623 int64_t expiration_int64 = 0; |
| 624 if (!base::StringToInt64(expiration_string, &expiration_int64)) { | 624 if (!base::StringToInt64(expiration_string, &expiration_int64)) { |
| 625 DVLOG(1) << "Malformed alternative service expiration for server: " | 625 DVLOG(1) << "Malformed alternative service expiration for server: " |
| 626 << server_str; | 626 << server_str; |
| 627 return false; | 627 return false; |
| 628 } | 628 } |
| 629 alternative_service_info->expiration = | 629 alternative_service_info->set_expiration( |
| 630 base::Time::FromInternalValue(expiration_int64); | 630 base::Time::FromInternalValue(expiration_int64)); |
| 631 return true; | 631 return true; |
| 632 } | 632 } |
| 633 | 633 |
| 634 DVLOG(1) << "Malformed alternative service expiration for server: " | 634 DVLOG(1) << "Malformed alternative service expiration for server: " |
| 635 << server_str; | 635 << server_str; |
| 636 return false; | 636 return false; |
| 637 } | 637 } |
| 638 | 638 |
| 639 bool HttpServerPropertiesManager::AddToAlternativeServiceMap( | 639 bool HttpServerPropertiesManager::AddToAlternativeServiceMap( |
| 640 const url::SchemeHostPort& server, | 640 const url::SchemeHostPort& server, |
| (...skipping 15 matching lines...) Expand all Loading... |
| 656 const base::DictionaryValue* alternative_service_dict; | 656 const base::DictionaryValue* alternative_service_dict; |
| 657 if (!alternative_service_list_item.GetAsDictionary( | 657 if (!alternative_service_list_item.GetAsDictionary( |
| 658 &alternative_service_dict)) | 658 &alternative_service_dict)) |
| 659 return false; | 659 return false; |
| 660 AlternativeServiceInfo alternative_service_info; | 660 AlternativeServiceInfo alternative_service_info; |
| 661 if (!ParseAlternativeServiceDict(*alternative_service_dict, | 661 if (!ParseAlternativeServiceDict(*alternative_service_dict, |
| 662 server.Serialize(), | 662 server.Serialize(), |
| 663 &alternative_service_info)) { | 663 &alternative_service_info)) { |
| 664 return false; | 664 return false; |
| 665 } | 665 } |
| 666 if (base::Time::Now() < alternative_service_info.expiration) { | 666 if (base::Time::Now() < alternative_service_info.expiration()) { |
| 667 alternative_service_info_vector.push_back(alternative_service_info); | 667 alternative_service_info_vector.push_back(alternative_service_info); |
| 668 } | 668 } |
| 669 } | 669 } |
| 670 | 670 |
| 671 if (alternative_service_info_vector.empty()) { | 671 if (alternative_service_info_vector.empty()) { |
| 672 return false; | 672 return false; |
| 673 } | 673 } |
| 674 | 674 |
| 675 alternative_service_map->Put(server, alternative_service_info_vector); | 675 alternative_service_map->Put(server, alternative_service_info_vector); |
| 676 return true; | 676 return true; |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 851 int count = 0; | 851 int count = 0; |
| 852 typedef std::map<std::string, bool> CanonicalHostPersistedMap; | 852 typedef std::map<std::string, bool> CanonicalHostPersistedMap; |
| 853 CanonicalHostPersistedMap persisted_map; | 853 CanonicalHostPersistedMap persisted_map; |
| 854 // Maintain MRU order. | 854 // Maintain MRU order. |
| 855 for (AlternativeServiceMap::const_reverse_iterator it = map.rbegin(); | 855 for (AlternativeServiceMap::const_reverse_iterator it = map.rbegin(); |
| 856 it != map.rend() && count < kMaxAlternateProtocolHostsToPersist; ++it) { | 856 it != map.rend() && count < kMaxAlternateProtocolHostsToPersist; ++it) { |
| 857 const url::SchemeHostPort& server = it->first; | 857 const url::SchemeHostPort& server = it->first; |
| 858 AlternativeServiceInfoVector notbroken_alternative_service_info_vector; | 858 AlternativeServiceInfoVector notbroken_alternative_service_info_vector; |
| 859 for (const AlternativeServiceInfo& alternative_service_info : it->second) { | 859 for (const AlternativeServiceInfo& alternative_service_info : it->second) { |
| 860 // Do not persist expired entries. | 860 // Do not persist expired entries. |
| 861 if (alternative_service_info.expiration < base::Time::Now()) { | 861 if (alternative_service_info.expiration() < base::Time::Now()) { |
| 862 continue; | 862 continue; |
| 863 } | 863 } |
| 864 AlternativeService alternative_service( | 864 AlternativeService alternative_service( |
| 865 alternative_service_info.alternative_service); | 865 alternative_service_info.alternative_service()); |
| 866 if (!IsAlternateProtocolValid(alternative_service.protocol)) { | 866 if (!IsAlternateProtocolValid(alternative_service.protocol)) { |
| 867 continue; | 867 continue; |
| 868 } | 868 } |
| 869 if (alternative_service.host.empty()) { | 869 if (alternative_service.host.empty()) { |
| 870 alternative_service.host = server.host(); | 870 alternative_service.host = server.host(); |
| 871 } | 871 } |
| 872 if (IsAlternativeServiceBroken(alternative_service)) { | 872 if (IsAlternativeServiceBroken(alternative_service)) { |
| 873 continue; | 873 continue; |
| 874 } | 874 } |
| 875 notbroken_alternative_service_info_vector.push_back( | 875 notbroken_alternative_service_info_vector.push_back( |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1065 base::DictionaryValue* server_pref_dict) { | 1065 base::DictionaryValue* server_pref_dict) { |
| 1066 if (!alternative_service_info_vector || | 1066 if (!alternative_service_info_vector || |
| 1067 alternative_service_info_vector->empty()) { | 1067 alternative_service_info_vector->empty()) { |
| 1068 return; | 1068 return; |
| 1069 } | 1069 } |
| 1070 std::unique_ptr<base::ListValue> alternative_service_list( | 1070 std::unique_ptr<base::ListValue> alternative_service_list( |
| 1071 new base::ListValue); | 1071 new base::ListValue); |
| 1072 for (const AlternativeServiceInfo& alternative_service_info : | 1072 for (const AlternativeServiceInfo& alternative_service_info : |
| 1073 *alternative_service_info_vector) { | 1073 *alternative_service_info_vector) { |
| 1074 const AlternativeService alternative_service = | 1074 const AlternativeService alternative_service = |
| 1075 alternative_service_info.alternative_service; | 1075 alternative_service_info.alternative_service(); |
| 1076 DCHECK(IsAlternateProtocolValid(alternative_service.protocol)); | 1076 DCHECK(IsAlternateProtocolValid(alternative_service.protocol)); |
| 1077 std::unique_ptr<base::DictionaryValue> alternative_service_dict( | 1077 std::unique_ptr<base::DictionaryValue> alternative_service_dict( |
| 1078 new base::DictionaryValue); | 1078 new base::DictionaryValue); |
| 1079 alternative_service_dict->SetInteger(kPortKey, alternative_service.port); | 1079 alternative_service_dict->SetInteger(kPortKey, alternative_service.port); |
| 1080 if (!alternative_service.host.empty()) { | 1080 if (!alternative_service.host.empty()) { |
| 1081 alternative_service_dict->SetString(kHostKey, alternative_service.host); | 1081 alternative_service_dict->SetString(kHostKey, alternative_service.host); |
| 1082 } | 1082 } |
| 1083 alternative_service_dict->SetString( | 1083 alternative_service_dict->SetString( |
| 1084 kProtocolKey, NextProtoToString(alternative_service.protocol)); | 1084 kProtocolKey, NextProtoToString(alternative_service.protocol)); |
| 1085 // JSON cannot store int64_t, so expiration is converted to a string. | 1085 // JSON cannot store int64_t, so expiration is converted to a string. |
| 1086 alternative_service_dict->SetString( | 1086 alternative_service_dict->SetString( |
| 1087 kExpirationKey, | 1087 kExpirationKey, |
| 1088 base::Int64ToString( | 1088 base::Int64ToString( |
| 1089 alternative_service_info.expiration.ToInternalValue())); | 1089 alternative_service_info.expiration().ToInternalValue())); |
| 1090 alternative_service_list->Append(std::move(alternative_service_dict)); | 1090 alternative_service_list->Append(std::move(alternative_service_dict)); |
| 1091 } | 1091 } |
| 1092 if (alternative_service_list->GetSize() == 0) | 1092 if (alternative_service_list->GetSize() == 0) |
| 1093 return; | 1093 return; |
| 1094 server_pref_dict->SetWithoutPathExpansion( | 1094 server_pref_dict->SetWithoutPathExpansion( |
| 1095 kAlternativeServiceKey, std::move(alternative_service_list)); | 1095 kAlternativeServiceKey, std::move(alternative_service_list)); |
| 1096 } | 1096 } |
| 1097 | 1097 |
| 1098 void HttpServerPropertiesManager::SaveSupportsQuicToPrefs( | 1098 void HttpServerPropertiesManager::SaveSupportsQuicToPrefs( |
| 1099 const IPAddress* last_quic_address, | 1099 const IPAddress* last_quic_address, |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1149 if (!setting_prefs_) | 1149 if (!setting_prefs_) |
| 1150 ScheduleUpdateCacheOnPrefThread(); | 1150 ScheduleUpdateCacheOnPrefThread(); |
| 1151 } | 1151 } |
| 1152 | 1152 |
| 1153 void HttpServerPropertiesManager::SetInitialized() { | 1153 void HttpServerPropertiesManager::SetInitialized() { |
| 1154 DCHECK(network_task_runner_->RunsTasksInCurrentSequence()); | 1154 DCHECK(network_task_runner_->RunsTasksInCurrentSequence()); |
| 1155 is_initialized_ = true; | 1155 is_initialized_ = true; |
| 1156 } | 1156 } |
| 1157 | 1157 |
| 1158 } // namespace net | 1158 } // namespace net |
| OLD | NEW |