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 <map> 9 #include <string> 10 #include <vector> 11 12 #include "base/basictypes.h" 13 #include "base/containers/hash_tables.h" 14 #include "base/containers/mru_cache.h" 15 #include "base/gtest_prod_util.h" 16 #include "base/threading/non_thread_safe.h" 17 #include "base/values.h" 18 #include "net/base/host_port_pair.h" 19 #include "net/base/net_export.h" 20 #include "net/http/http_pipelined_host_capability.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 virtual ~HttpServerPropertiesImpl(); 36 37 // Initializes |spdy_servers_table_| 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 // Initializes |pipeline_capability_map_| with the servers (host/port) from 48 // |pipeline_capability_map| that either support HTTP pipelining or not. 49 void InitializePipelineCapabilities( 50 const PipelineCapabilityMap* pipeline_capability_map); 51 52 // Get the list of servers (host/port) that support SPDY. 53 void GetSpdyServerList(base::ListValue* spdy_server_list) const; 54 55 // Returns flattened string representation of the |host_port_pair|. Used by 56 // unittests. 57 static std::string GetFlattenedSpdyServer( 58 const net::HostPortPair& host_port_pair); 59 60 // Debugging to simulate presence of an AlternateProtocol. 61 // If we don't have an alternate protocol in the map for any given host/port 62 // pair, force this ProtocolPortPair. 63 static void ForceAlternateProtocol(const PortAlternateProtocolPair& pair); 64 static void DisableForcedAlternateProtocol(); 65 66 // Changes the number of host/port pairs we remember pipelining capability 67 // for. A larger number means we're more likely to be able to pipeline 68 // immediately if a host is known good, but uses more memory. This function 69 // can only be called if |pipeline_capability_map_| is empty. 70 void SetNumPipelinedHostsToRemember(int max_size); 71 72 // ----------------------------- 73 // HttpServerProperties methods: 74 // ----------------------------- 75 76 // Gets a weak pointer for this object. 77 virtual base::WeakPtr<HttpServerProperties> GetWeakPtr() OVERRIDE; 78 79 // Deletes all data. 80 virtual void Clear() OVERRIDE; 81 82 // Returns true if |server| supports SPDY. 83 virtual bool SupportsSpdy(const HostPortPair& server) const OVERRIDE; 84 85 // Add |server| into the persistent store. 86 virtual void SetSupportsSpdy(const HostPortPair& server, 87 bool support_spdy) OVERRIDE; 88 89 // Returns true if |server| has an Alternate-Protocol header. 90 virtual bool HasAlternateProtocol(const HostPortPair& server) const OVERRIDE; 91 92 // Returns the Alternate-Protocol and port for |server|. 93 // HasAlternateProtocol(server) must be true. 94 virtual PortAlternateProtocolPair GetAlternateProtocol( 95 const HostPortPair& server) const OVERRIDE; 96 97 // Sets the Alternate-Protocol for |server|. 98 virtual void SetAlternateProtocol( 99 const HostPortPair& server, 100 uint16 alternate_port, 101 AlternateProtocol alternate_protocol) OVERRIDE; 102 103 // Sets the Alternate-Protocol for |server| to be BROKEN. 104 virtual void SetBrokenAlternateProtocol(const HostPortPair& server) OVERRIDE; 105 106 // Returns all Alternate-Protocol mappings. 107 virtual const AlternateProtocolMap& alternate_protocol_map() const OVERRIDE; 108 109 // Gets a reference to the SettingsMap stored for a host. 110 // If no settings are stored, returns an empty SettingsMap. 111 virtual const SettingsMap& GetSpdySettings( 112 const HostPortPair& host_port_pair) const OVERRIDE; 113 114 // Saves an individual SPDY setting for a host. Returns true if SPDY setting 115 // is to be persisted. 116 virtual bool SetSpdySetting(const HostPortPair& host_port_pair, 117 SpdySettingsIds id, 118 SpdySettingsFlags flags, 119 uint32 value) OVERRIDE; 120 121 // Clears all entries in |spdy_settings_map_| for a host. 122 virtual void ClearSpdySettings(const HostPortPair& host_port_pair) OVERRIDE; 123 124 // Clears all entries in |spdy_settings_map_|. 125 virtual void ClearAllSpdySettings() OVERRIDE; 126 127 // Returns all persistent SPDY settings. 128 virtual const SpdySettingsMap& spdy_settings_map() const OVERRIDE; 129 130 virtual HttpPipelinedHostCapability GetPipelineCapability( 131 const HostPortPair& origin) OVERRIDE; 132 133 virtual void SetPipelineCapability( 134 const HostPortPair& origin, 135 HttpPipelinedHostCapability capability) OVERRIDE; 136 137 virtual void ClearPipelineCapabilities() OVERRIDE; 138 139 virtual PipelineCapabilityMap GetPipelineCapabilityMap() const OVERRIDE; 140 141 private: 142 typedef base::MRUCache< 143 HostPortPair, HttpPipelinedHostCapability> CachedPipelineCapabilityMap; 144 // |spdy_servers_table_| has flattened representation of servers (host/port 145 // pair) that either support or not support SPDY protocol. 146 typedef base::hash_map<std::string, bool> SpdyServerHostPortTable; 147 148 SpdyServerHostPortTable spdy_servers_table_; 149 150 AlternateProtocolMap alternate_protocol_map_; 151 SpdySettingsMap spdy_settings_map_; 152 scoped_ptr<CachedPipelineCapabilityMap> pipeline_capability_map_; 153 154 base::WeakPtrFactory<HttpServerPropertiesImpl> weak_ptr_factory_; 155 156 DISALLOW_COPY_AND_ASSIGN(HttpServerPropertiesImpl); 157 }; 158 159 } // namespace net 160 161 #endif // NET_HTTP_HTTP_SERVER_PROPERTIES_IMPL_H_ 162