| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef NET_HTTP_HTTP_SERVER_PROPERTIES_IMPL_H_ | |
| 6 #define NET_HTTP_HTTP_SERVER_PROPERTIES_IMPL_H_ | |
| 7 | |
| 8 #include <deque> | |
| 9 #include <map> | |
| 10 #include <set> | |
| 11 #include <string> | |
| 12 #include <vector> | |
| 13 | |
| 14 #include "base/basictypes.h" | |
| 15 #include "base/containers/hash_tables.h" | |
| 16 #include "base/gtest_prod_util.h" | |
| 17 #include "base/threading/non_thread_safe.h" | |
| 18 #include "base/values.h" | |
| 19 #include "net/base/host_port_pair.h" | |
| 20 #include "net/base/net_export.h" | |
| 21 #include "net/http/http_server_properties.h" | |
| 22 | |
| 23 namespace base { | |
| 24 class ListValue; | |
| 25 } | |
| 26 | |
| 27 namespace net { | |
| 28 | |
| 29 // The implementation for setting/retrieving the HTTP server properties. | |
| 30 class NET_EXPORT HttpServerPropertiesImpl | |
| 31 : public HttpServerProperties, | |
| 32 NON_EXPORTED_BASE(public base::NonThreadSafe) { | |
| 33 public: | |
| 34 HttpServerPropertiesImpl(); | |
| 35 ~HttpServerPropertiesImpl() override; | |
| 36 | |
| 37 // Initializes |spdy_servers_map_| with the servers (host/port) from | |
| 38 // |spdy_servers| that either support SPDY or not. | |
| 39 void InitializeSpdyServers(std::vector<std::string>* spdy_servers, | |
| 40 bool support_spdy); | |
| 41 | |
| 42 void InitializeAlternateProtocolServers( | |
| 43 AlternateProtocolMap* alternate_protocol_servers); | |
| 44 | |
| 45 void InitializeSpdySettingsServers(SpdySettingsMap* spdy_settings_map); | |
| 46 | |
| 47 void InitializeSupportsQuic(IPAddressNumber* last_address); | |
| 48 | |
| 49 void InitializeServerNetworkStats( | |
| 50 ServerNetworkStatsMap* server_network_stats_map); | |
| 51 | |
| 52 // Get the list of servers (host/port) that support SPDY. The max_size is the | |
| 53 // number of MRU servers that support SPDY that are to be returned. | |
| 54 void GetSpdyServerList(base::ListValue* spdy_server_list, | |
| 55 size_t max_size) const; | |
| 56 | |
| 57 // Returns flattened string representation of the |host_port_pair|. Used by | |
| 58 // unittests. | |
| 59 static std::string GetFlattenedSpdyServer(const HostPortPair& host_port_pair); | |
| 60 | |
| 61 // Debugging to simulate presence of an AlternateProtocol. | |
| 62 // If we don't have an alternate protocol in the map for any given host/port | |
| 63 // pair, force this ProtocolPortPair. | |
| 64 static void ForceAlternateProtocol(const AlternateProtocolInfo& pair); | |
| 65 static void DisableForcedAlternateProtocol(); | |
| 66 | |
| 67 // Returns the canonical host suffix for |host|, or std::string() if none | |
| 68 // exists. | |
| 69 std::string GetCanonicalSuffix(const std::string& host); | |
| 70 | |
| 71 // ----------------------------- | |
| 72 // HttpServerProperties methods: | |
| 73 // ----------------------------- | |
| 74 | |
| 75 base::WeakPtr<HttpServerProperties> GetWeakPtr() override; | |
| 76 void Clear() override; | |
| 77 bool SupportsRequestPriority(const HostPortPair& server) override; | |
| 78 void SetSupportsSpdy(const HostPortPair& server, bool support_spdy) override; | |
| 79 bool RequiresHTTP11(const HostPortPair& server) override; | |
| 80 void SetHTTP11Required(const HostPortPair& server) override; | |
| 81 void MaybeForceHTTP11(const HostPortPair& server, | |
| 82 SSLConfig* ssl_config) override; | |
| 83 AlternateProtocolInfo GetAlternateProtocol( | |
| 84 const HostPortPair& server) override; | |
| 85 void SetAlternateProtocol(const HostPortPair& server, | |
| 86 uint16 alternate_port, | |
| 87 AlternateProtocol alternate_protocol, | |
| 88 double probability) override; | |
| 89 void SetBrokenAlternateProtocol(const HostPortPair& server) override; | |
| 90 bool WasAlternateProtocolRecentlyBroken(const HostPortPair& server) override; | |
| 91 void ConfirmAlternateProtocol(const HostPortPair& server) override; | |
| 92 void ClearAlternateProtocol(const HostPortPair& server) override; | |
| 93 const AlternateProtocolMap& alternate_protocol_map() const override; | |
| 94 void SetAlternateProtocolProbabilityThreshold(double threshold) override; | |
| 95 const SettingsMap& GetSpdySettings( | |
| 96 const HostPortPair& host_port_pair) override; | |
| 97 bool SetSpdySetting(const HostPortPair& host_port_pair, | |
| 98 SpdySettingsIds id, | |
| 99 SpdySettingsFlags flags, | |
| 100 uint32 value) override; | |
| 101 void ClearSpdySettings(const HostPortPair& host_port_pair) override; | |
| 102 void ClearAllSpdySettings() override; | |
| 103 const SpdySettingsMap& spdy_settings_map() const override; | |
| 104 bool GetSupportsQuic(IPAddressNumber* last_address) const override; | |
| 105 void SetSupportsQuic(bool used_quic, const IPAddressNumber& address) override; | |
| 106 void SetServerNetworkStats(const HostPortPair& host_port_pair, | |
| 107 ServerNetworkStats stats) override; | |
| 108 const ServerNetworkStats* GetServerNetworkStats( | |
| 109 const HostPortPair& host_port_pair) override; | |
| 110 const ServerNetworkStatsMap& server_network_stats_map() const override; | |
| 111 | |
| 112 private: | |
| 113 // |spdy_servers_map_| has flattened representation of servers (host, port) | |
| 114 // that either support or not support SPDY protocol. | |
| 115 typedef base::MRUCache<std::string, bool> SpdyServerHostPortMap; | |
| 116 typedef std::map<HostPortPair, HostPortPair> CanonicalHostMap; | |
| 117 typedef std::vector<std::string> CanonicalSufficList; | |
| 118 typedef std::set<HostPortPair> Http11ServerHostPortSet; | |
| 119 | |
| 120 // Server, port, and AlternateProtocol: an entity that can be broken. (Once | |
| 121 // we use AlternativeService, the same AltSvc can be broken for one server but | |
| 122 // not for another depending on what certificate it can offer.) | |
| 123 struct BrokenAlternateProtocolEntry { | |
| 124 BrokenAlternateProtocolEntry(const BrokenAlternateProtocolEntry&) = default; | |
| 125 BrokenAlternateProtocolEntry(const HostPortPair& server, | |
| 126 uint16 port, | |
| 127 AlternateProtocol protocol) | |
| 128 : server(server), port(port), protocol(protocol) {} | |
| 129 | |
| 130 bool operator<(const BrokenAlternateProtocolEntry& other) const { | |
| 131 if (!server.Equals(other.server)) | |
| 132 return server < other.server; | |
| 133 if (port != other.port) | |
| 134 return port < other.port; | |
| 135 return protocol < other.protocol; | |
| 136 } | |
| 137 | |
| 138 HostPortPair server; | |
| 139 uint16 port; | |
| 140 AlternateProtocol protocol; | |
| 141 }; | |
| 142 // BrokenAlternateProtocolEntry with expiration time. | |
| 143 struct BrokenAlternateProtocolEntryWithTime { | |
| 144 BrokenAlternateProtocolEntryWithTime( | |
| 145 const BrokenAlternateProtocolEntry& broken_alternate_protocol_entry, | |
| 146 base::TimeTicks when) | |
| 147 : broken_alternate_protocol_entry(broken_alternate_protocol_entry), | |
| 148 when(when) {} | |
| 149 | |
| 150 BrokenAlternateProtocolEntry broken_alternate_protocol_entry; | |
| 151 base::TimeTicks when; | |
| 152 }; | |
| 153 // Deque of BrokenAlternateProtocolEntryWithTime items, ordered by expiration | |
| 154 // time. | |
| 155 typedef std::deque<BrokenAlternateProtocolEntryWithTime> | |
| 156 BrokenAlternateProtocolList; | |
| 157 // Map from (server, alternate protocol and port) to the number of | |
| 158 // times that alternate protocol has been marked broken for that server. | |
| 159 typedef std::map<BrokenAlternateProtocolEntry, int> | |
| 160 BrokenAlternateProtocolMap; | |
| 161 | |
| 162 // Return the iterator for |server|, or for its canonical host, or end. | |
| 163 AlternateProtocolMap::const_iterator GetAlternateProtocolIterator( | |
| 164 const HostPortPair& server); | |
| 165 | |
| 166 // Return the canonical host for |server|, or end if none exists. | |
| 167 CanonicalHostMap::const_iterator GetCanonicalHost(HostPortPair server) const; | |
| 168 | |
| 169 void RemoveCanonicalHost(const HostPortPair& server); | |
| 170 void ExpireBrokenAlternateProtocolMappings(); | |
| 171 void ScheduleBrokenAlternateProtocolMappingsExpiration(); | |
| 172 | |
| 173 SpdyServerHostPortMap spdy_servers_map_; | |
| 174 Http11ServerHostPortSet http11_servers_; | |
| 175 | |
| 176 AlternateProtocolMap alternate_protocol_map_; | |
| 177 BrokenAlternateProtocolList broken_alternate_protocol_list_; | |
| 178 BrokenAlternateProtocolMap broken_alternate_protocol_map_; | |
| 179 | |
| 180 IPAddressNumber last_quic_address_; | |
| 181 SpdySettingsMap spdy_settings_map_; | |
| 182 ServerNetworkStatsMap server_network_stats_map_; | |
| 183 // Contains a map of servers which could share the same alternate protocol. | |
| 184 // Map from a Canonical host/port (host is some postfix of host names) to an | |
| 185 // actual origin, which has a plausible alternate protocol mapping. | |
| 186 CanonicalHostMap canonical_host_to_origin_map_; | |
| 187 // Contains list of suffixes (for exmaple ".c.youtube.com", | |
| 188 // ".googlevideo.com", ".googleusercontent.com") of canonical hostnames. | |
| 189 CanonicalSufficList canonical_suffixes_; | |
| 190 | |
| 191 double alternate_protocol_probability_threshold_; | |
| 192 | |
| 193 base::WeakPtrFactory<HttpServerPropertiesImpl> weak_ptr_factory_; | |
| 194 | |
| 195 DISALLOW_COPY_AND_ASSIGN(HttpServerPropertiesImpl); | |
| 196 }; | |
| 197 | |
| 198 } // namespace net | |
| 199 | |
| 200 #endif // NET_HTTP_HTTP_SERVER_PROPERTIES_IMPL_H_ | |
| OLD | NEW |