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.
5 #ifndef NET_HTTP_HTTP_SERVER_PROPERTIES_IMPL_H_
6 #define NET_HTTP_HTTP_SERVER_PROPERTIES_IMPL_H_
12 #include "base/basictypes.h"
13 #include "base/containers/hash_tables.h"
14 #include "base/gtest_prod_util.h"
15 #include "base/threading/non_thread_safe.h"
16 #include "base/values.h"
17 #include "net/base/host_port_pair.h"
18 #include "net/base/net_export.h"
19 #include "net/http/http_server_properties.h"
27 // The implementation for setting/retrieving the HTTP server properties.
28 class NET_EXPORT HttpServerPropertiesImpl
29 : public HttpServerProperties
,
30 NON_EXPORTED_BASE(public base::NonThreadSafe
) {
32 HttpServerPropertiesImpl();
33 virtual ~HttpServerPropertiesImpl();
35 // Initializes |spdy_servers_map_| with the servers (host/port) from
36 // |spdy_servers| that either support SPDY or not.
37 void InitializeSpdyServers(std::vector
<std::string
>* spdy_servers
,
40 void InitializeAlternateProtocolServers(
41 AlternateProtocolMap
* alternate_protocol_servers
);
43 void InitializeSpdySettingsServers(SpdySettingsMap
* spdy_settings_map
);
45 // Get the list of servers (host/port) that support SPDY. The max_size is the
46 // number of MRU servers that support SPDY that are to be returned.
47 void GetSpdyServerList(base::ListValue
* spdy_server_list
,
48 size_t max_size
) const;
50 // Returns flattened string representation of the |host_port_pair|. Used by
52 static std::string
GetFlattenedSpdyServer(
53 const net::HostPortPair
& host_port_pair
);
55 // Debugging to simulate presence of an AlternateProtocol.
56 // If we don't have an alternate protocol in the map for any given host/port
57 // pair, force this ProtocolPortPair.
58 static void ForceAlternateProtocol(const AlternateProtocolInfo
& pair
);
59 static void DisableForcedAlternateProtocol();
61 // Returns the canonical host suffix for |server|, or std::string() if none
63 std::string
GetCanonicalSuffix(const net::HostPortPair
& server
);
65 // -----------------------------
66 // HttpServerProperties methods:
67 // -----------------------------
69 // Gets a weak pointer for this object.
70 virtual base::WeakPtr
<HttpServerProperties
> GetWeakPtr() OVERRIDE
;
73 virtual void Clear() OVERRIDE
;
75 // Returns true if |server| supports SPDY.
76 virtual bool SupportsSpdy(const HostPortPair
& server
) OVERRIDE
;
78 // Add |server| into the persistent store.
79 virtual void SetSupportsSpdy(const HostPortPair
& server
,
80 bool support_spdy
) OVERRIDE
;
82 // Returns true if |server| has an Alternate-Protocol header.
83 virtual bool HasAlternateProtocol(const HostPortPair
& server
) OVERRIDE
;
85 // Returns the Alternate-Protocol and port for |server|.
86 // HasAlternateProtocol(server) must be true.
87 virtual AlternateProtocolInfo
GetAlternateProtocol(
88 const HostPortPair
& server
) OVERRIDE
;
90 // Sets the Alternate-Protocol for |server|.
91 virtual void SetAlternateProtocol(
92 const HostPortPair
& server
,
93 uint16 alternate_port
,
94 AlternateProtocol alternate_protocol
,
95 double probability
) OVERRIDE
;
97 // Sets the Alternate-Protocol for |server| to be BROKEN.
98 virtual void SetBrokenAlternateProtocol(const HostPortPair
& server
) OVERRIDE
;
100 // Returns true if Alternate-Protocol for |server| was recently BROKEN.
101 virtual bool WasAlternateProtocolRecentlyBroken(
102 const HostPortPair
& server
) OVERRIDE
;
104 // Confirms that Alternate-Protocol for |server| is working.
105 virtual void ConfirmAlternateProtocol(const HostPortPair
& server
) OVERRIDE
;
107 // Clears the Alternate-Protocol for |server|.
108 virtual void ClearAlternateProtocol(const HostPortPair
& server
) OVERRIDE
;
110 // Returns all Alternate-Protocol mappings.
111 virtual const AlternateProtocolMap
& alternate_protocol_map() const OVERRIDE
;
113 virtual void SetAlternateProtocolExperiment(
114 AlternateProtocolExperiment experiment
) OVERRIDE
;
116 virtual void SetAlternateProtocolProbabilityThreshold(
117 double threshold
) OVERRIDE
;
119 virtual AlternateProtocolExperiment
GetAlternateProtocolExperiment()
122 // Gets a reference to the SettingsMap stored for a host.
123 // If no settings are stored, returns an empty SettingsMap.
124 virtual const SettingsMap
& GetSpdySettings(
125 const HostPortPair
& host_port_pair
) OVERRIDE
;
127 // Saves an individual SPDY setting for a host. Returns true if SPDY setting
128 // is to be persisted.
129 virtual bool SetSpdySetting(const HostPortPair
& host_port_pair
,
131 SpdySettingsFlags flags
,
132 uint32 value
) OVERRIDE
;
134 // Clears all entries in |spdy_settings_map_| for a host.
135 virtual void ClearSpdySettings(const HostPortPair
& host_port_pair
) OVERRIDE
;
137 // Clears all entries in |spdy_settings_map_|.
138 virtual void ClearAllSpdySettings() OVERRIDE
;
140 // Returns all persistent SPDY settings.
141 virtual const SpdySettingsMap
& spdy_settings_map() const OVERRIDE
;
143 virtual void SetServerNetworkStats(const HostPortPair
& host_port_pair
,
144 NetworkStats stats
) OVERRIDE
;
146 virtual const NetworkStats
* GetServerNetworkStats(
147 const HostPortPair
& host_port_pair
) const OVERRIDE
;
150 // |spdy_servers_map_| has flattened representation of servers (host, port)
151 // that either support or not support SPDY protocol.
152 typedef base::MRUCache
<std::string
, bool> SpdyServerHostPortMap
;
153 typedef std::map
<HostPortPair
, NetworkStats
> ServerNetworkStatsMap
;
154 typedef std::map
<HostPortPair
, HostPortPair
> CanonicalHostMap
;
155 typedef std::vector
<std::string
> CanonicalSufficList
;
156 // List of broken host:ports and the times when they can be expired.
157 struct BrokenAlternateProtocolEntry
{
159 base::TimeTicks when
;
161 typedef std::list
<BrokenAlternateProtocolEntry
>
162 BrokenAlternateProtocolList
;
163 // Map from host:port to the number of times alternate protocol has
164 // been marked broken.
165 typedef std::map
<HostPortPair
, int> BrokenAlternateProtocolMap
;
167 // Return the canonical host for |server|, or end if none exists.
168 CanonicalHostMap::const_iterator
GetCanonicalHost(HostPortPair server
) const;
170 void RemoveCanonicalHost(const HostPortPair
& server
);
171 void ExpireBrokenAlternateProtocolMappings();
172 void ScheduleBrokenAlternateProtocolMappingsExpiration();
174 SpdyServerHostPortMap spdy_servers_map_
;
176 AlternateProtocolMap alternate_protocol_map_
;
177 BrokenAlternateProtocolList broken_alternate_protocol_list_
;
178 BrokenAlternateProtocolMap broken_alternate_protocol_map_
;
179 AlternateProtocolExperiment alternate_protocol_experiment_
;
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 canoncial hostnames.
189 CanonicalSufficList canoncial_suffixes_
;
191 double alternate_protocol_probability_threshold_
;
193 base::WeakPtrFactory
<HttpServerPropertiesImpl
> weak_ptr_factory_
;
195 DISALLOW_COPY_AND_ASSIGN(HttpServerPropertiesImpl
);
200 #endif // NET_HTTP_HTTP_SERVER_PROPERTIES_IMPL_H_