#ifndef NET_HTTP_HTTP_SERVER_PROPERTIES_MANAGER_H_
#define NET_HTTP_HTTP_SERVER_PROPERTIES_MANAGER_H_
#include <memory>
#include <string>
#include "base/functional/callback.h"
#include "base/gtest_prod_util.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/sequence_checker.h"
#include "net/base/host_port_pair.h"
#include "net/base/net_export.h"
#include "net/http/alternative_service.h"
#include "net/http/broken_alternative_services.h"
#include "net/http/http_server_properties.h"
#include "net/log/net_log_with_source.h"
namespace base {
class TickClock;
}
namespace net {
class IPAddress;
class NET_EXPORT_PRIVATE HttpServerPropertiesManager {
public:
using OnPrefsLoadedCallback = base::OnceCallback<void(
std::unique_ptr<HttpServerProperties::ServerInfoMap> server_info_map,
const IPAddress& last_local_address_when_quic_worked,
std::unique_ptr<HttpServerProperties::QuicServerInfoMap>
quic_server_info_map,
std::unique_ptr<BrokenAlternativeServiceList>
broken_alternative_service_list,
std::unique_ptr<RecentlyBrokenAlternativeServices>
recently_broken_alternative_services)>;
using GetCannonicalSuffix =
base::RepeatingCallback<const std::string*(const std::string& host)>;
HttpServerPropertiesManager(
std::unique_ptr<HttpServerProperties::PrefDelegate> pref_delegate,
OnPrefsLoadedCallback on_prefs_loaded_callback,
size_t max_server_configs_stored_in_properties,
NetLog* net_log,
const base::TickClock* clock = nullptr);
HttpServerPropertiesManager(const HttpServerPropertiesManager&) = delete;
HttpServerPropertiesManager& operator=(const HttpServerPropertiesManager&) =
delete;
~HttpServerPropertiesManager();
void ReadPrefs(
std::unique_ptr<HttpServerProperties::ServerInfoMap>* server_info_map,
IPAddress* last_local_address_when_quic_worked,
std::unique_ptr<HttpServerProperties::QuicServerInfoMap>*
quic_server_info_map,
std::unique_ptr<BrokenAlternativeServiceList>*
broken_alternative_service_list,
std::unique_ptr<RecentlyBrokenAlternativeServices>*
recently_broken_alternative_services);
void set_max_server_configs_stored_in_properties(
size_t max_server_configs_stored_in_properties) {
max_server_configs_stored_in_properties_ =
max_server_configs_stored_in_properties;
}
void WriteToPrefs(
const HttpServerProperties::ServerInfoMap& server_info_map,
const GetCannonicalSuffix& get_canonical_suffix,
const IPAddress& last_local_address_when_quic_worked,
const HttpServerProperties::QuicServerInfoMap& quic_server_info_map,
const BrokenAlternativeServiceList& broken_alternative_service_list,
const RecentlyBrokenAlternativeServices&
recently_broken_alternative_services,
base::OnceClosure callback);
private:
FRIEND_TEST_ALL_PREFIXES(HttpServerPropertiesManagerTest,
ParseAlternativeServiceInfo);
FRIEND_TEST_ALL_PREFIXES(HttpServerPropertiesManagerTest,
ReadAdvertisedVersionsFromPref);
FRIEND_TEST_ALL_PREFIXES(HttpServerPropertiesManagerTest,
DoNotLoadAltSvcForInsecureOrigins);
FRIEND_TEST_ALL_PREFIXES(HttpServerPropertiesManagerTest,
DoNotLoadExpiredAlternativeService);
FRIEND_TEST_ALL_PREFIXES(HttpServerPropertiesManagerTest,
AdvertisedVersionsRoundTrip);
void AddServerData(const base::Value::Dict& server_dict,
HttpServerProperties::ServerInfoMap* server_info_map,
bool use_network_anonymization_key);
static bool ParseAlternativeServiceDict(
const base::Value::Dict& dict,
bool host_optional,
const std::string& parsing_under,
AlternativeService* alternative_service);
static bool ParseAlternativeServiceInfoDictOfServer(
const base::Value::Dict& dict,
const std::string& server_str,
AlternativeServiceInfo* alternative_service_info);
static bool ParseAlternativeServiceInfo(
const url::SchemeHostPort& server,
const base::Value::Dict& server_dict,
HttpServerProperties::ServerInfo* server_info);
void ReadLastLocalAddressWhenQuicWorked(
const base::Value::Dict& server_dict,
IPAddress* last_local_address_when_quic_worked);
void ParseNetworkStats(const url::SchemeHostPort& server,
const base::Value::Dict& server_dict,
HttpServerProperties::ServerInfo* server_info);
void AddToQuicServerInfoMap(
const base::Value::Dict& server_dict,
bool use_network_anonymization_key,
HttpServerProperties::QuicServerInfoMap* quic_server_info_map);
void AddToBrokenAlternativeServices(
const base::Value::Dict& broken_alt_svc_entry_dict,
bool use_network_anonymization_key,
BrokenAlternativeServiceList* broken_alternative_service_list,
RecentlyBrokenAlternativeServices* recently_broken_alternative_services);
void SaveAlternativeServiceToServerPrefs(
const AlternativeServiceInfoVector& alternative_service_info_vector,
base::Value::Dict& server_pref_dict);
void SaveLastLocalAddressWhenQuicWorkedToPrefs(
const IPAddress& last_local_address_when_quic_worked,
base::Value::Dict& http_server_properties_dict);
void SaveNetworkStatsToServerPrefs(
const ServerNetworkStats& server_network_stats,
base::Value::Dict& server_pref_dict);
void SaveQuicServerInfoMapToServerPrefs(
const HttpServerProperties::QuicServerInfoMap& quic_server_info_map,
base::Value::Dict& http_server_properties_dict);
void SaveBrokenAlternativeServicesToPrefs(
const BrokenAlternativeServiceList& broken_alternative_service_list,
size_t max_broken_alternative_services,
const RecentlyBrokenAlternativeServices&
recently_broken_alternative_services,
base::Value::Dict& http_server_properties_dict);
void OnHttpServerPropertiesLoaded();
std::unique_ptr<HttpServerProperties::PrefDelegate> pref_delegate_;
OnPrefsLoadedCallback on_prefs_loaded_callback_;
size_t max_server_configs_stored_in_properties_;
raw_ptr<const base::TickClock> clock_;
const NetLogWithSource net_log_;
SEQUENCE_CHECKER(sequence_checker_);
base::WeakPtrFactory<HttpServerPropertiesManager> pref_load_weak_ptr_factory_{
this};
};
}
#endif