Home | History | Annotate | Download | only in http
      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_H_
      6 #define NET_HTTP_HTTP_SERVER_PROPERTIES_H_
      7 
      8 #include <map>
      9 #include <string>
     10 #include "base/basictypes.h"
     11 #include "base/containers/mru_cache.h"
     12 #include "base/memory/weak_ptr.h"
     13 #include "base/time/time.h"
     14 #include "net/base/host_port_pair.h"
     15 #include "net/base/net_export.h"
     16 #include "net/socket/next_proto.h"
     17 #include "net/spdy/spdy_framer.h"  // TODO(willchan): Reconsider this.
     18 
     19 namespace net {
     20 
     21 enum AlternateProtocolExperiment {
     22   // 200 alternate_protocol servers are loaded (persisted 200 MRU servers).
     23   ALTERNATE_PROTOCOL_NOT_PART_OF_EXPERIMENT = 0,
     24   // 200 alternate_protocol servers are loaded (persisted 1000 MRU servers).
     25   ALTERNATE_PROTOCOL_TRUNCATED_200_SERVERS,
     26   // 1000 alternate_protocol servers are loaded (persisted 1000 MRU servers).
     27   ALTERNATE_PROTOCOL_TRUNCATED_1000_SERVERS,
     28 };
     29 
     30 enum AlternateProtocolUsage {
     31   // Alternate Protocol was used without racing a normal connection.
     32   ALTERNATE_PROTOCOL_USAGE_NO_RACE = 0,
     33   // Alternate Protocol was used by winning a race with a normal connection.
     34   ALTERNATE_PROTOCOL_USAGE_WON_RACE = 1,
     35   // Alternate Protocol was not used by losing a race with a normal connection.
     36   ALTERNATE_PROTOCOL_USAGE_LOST_RACE = 2,
     37   // Alternate Protocol was not used because no Alternate-Protocol information
     38   // was available when the request was issued, but an Alternate-Protocol header
     39   // was present in the response.
     40   ALTERNATE_PROTOCOL_USAGE_MAPPING_MISSING = 3,
     41   // Alternate Protocol was not used because it was marked broken.
     42   ALTERNATE_PROTOCOL_USAGE_BROKEN = 4,
     43   // Maximum value for the enum.
     44   ALTERNATE_PROTOCOL_USAGE_MAX,
     45 };
     46 
     47 // Log a histogram to reflect |usage| and |alternate_protocol_experiment|.
     48 NET_EXPORT void HistogramAlternateProtocolUsage(
     49     AlternateProtocolUsage usage,
     50     AlternateProtocolExperiment alternate_protocol_experiment);
     51 
     52 enum BrokenAlternateProtocolLocation {
     53   BROKEN_ALTERNATE_PROTOCOL_LOCATION_HTTP_STREAM_FACTORY_IMPL_JOB = 0,
     54   BROKEN_ALTERNATE_PROTOCOL_LOCATION_QUIC_STREAM_FACTORY = 1,
     55   BROKEN_ALTERNATE_PROTOCOL_LOCATION_HTTP_STREAM_FACTORY_IMPL_JOB_ALT = 2,
     56   BROKEN_ALTERNATE_PROTOCOL_LOCATION_HTTP_STREAM_FACTORY_IMPL_JOB_MAIN = 3,
     57   BROKEN_ALTERNATE_PROTOCOL_LOCATION_MAX,
     58 };
     59 
     60 // Log a histogram to reflect |location|.
     61 NET_EXPORT void HistogramBrokenAlternateProtocolLocation(
     62     BrokenAlternateProtocolLocation location);
     63 
     64 enum AlternateProtocol {
     65   DEPRECATED_NPN_SPDY_2 = 0,
     66   ALTERNATE_PROTOCOL_MINIMUM_VALID_VERSION = DEPRECATED_NPN_SPDY_2,
     67   NPN_SPDY_MINIMUM_VERSION = DEPRECATED_NPN_SPDY_2,
     68   NPN_SPDY_3,
     69   NPN_SPDY_3_1,
     70   NPN_SPDY_4,  // SPDY4 is HTTP/2.
     71   NPN_SPDY_MAXIMUM_VERSION = NPN_SPDY_4,
     72   QUIC,
     73   ALTERNATE_PROTOCOL_MAXIMUM_VALID_VERSION = QUIC,
     74   ALTERNATE_PROTOCOL_BROKEN,  // The alternate protocol is known to be broken.
     75   UNINITIALIZED_ALTERNATE_PROTOCOL,
     76 };
     77 
     78 // Simply returns whether |protocol| is between
     79 // ALTERNATE_PROTOCOL_MINIMUM_VALID_VERSION and
     80 // ALTERNATE_PROTOCOL_MAXIMUM_VALID_VERSION (inclusive).
     81 NET_EXPORT bool IsAlternateProtocolValid(AlternateProtocol protocol);
     82 
     83 enum AlternateProtocolSize {
     84   NUM_VALID_ALTERNATE_PROTOCOLS =
     85     ALTERNATE_PROTOCOL_MAXIMUM_VALID_VERSION -
     86     ALTERNATE_PROTOCOL_MINIMUM_VALID_VERSION + 1,
     87 };
     88 
     89 NET_EXPORT const char* AlternateProtocolToString(AlternateProtocol protocol);
     90 NET_EXPORT AlternateProtocol AlternateProtocolFromString(
     91     const std::string& str);
     92 NET_EXPORT_PRIVATE AlternateProtocol AlternateProtocolFromNextProto(
     93     NextProto next_proto);
     94 
     95 struct NET_EXPORT PortAlternateProtocolPair {
     96   bool Equals(const PortAlternateProtocolPair& other) const {
     97     return port == other.port && protocol == other.protocol;
     98   }
     99 
    100   std::string ToString() const;
    101 
    102   uint16 port;
    103   AlternateProtocol protocol;
    104 };
    105 
    106 typedef base::MRUCache<
    107     HostPortPair, PortAlternateProtocolPair> AlternateProtocolMap;
    108 typedef base::MRUCache<HostPortPair, SettingsMap> SpdySettingsMap;
    109 
    110 extern const char kAlternateProtocolHeader[];
    111 
    112 // The interface for setting/retrieving the HTTP server properties.
    113 // Currently, this class manages servers':
    114 // * SPDY support (based on NPN results)
    115 // * Alternate-Protocol support
    116 // * Spdy Settings (like CWND ID field)
    117 class NET_EXPORT HttpServerProperties {
    118  public:
    119   struct NetworkStats {
    120     base::TimeDelta srtt;
    121     uint64 bandwidth_estimate;
    122   };
    123 
    124   HttpServerProperties() {}
    125   virtual ~HttpServerProperties() {}
    126 
    127   // Gets a weak pointer for this object.
    128   virtual base::WeakPtr<HttpServerProperties> GetWeakPtr() = 0;
    129 
    130   // Deletes all data.
    131   virtual void Clear() = 0;
    132 
    133   // Returns true if |server| supports SPDY.
    134   virtual bool SupportsSpdy(const HostPortPair& server) = 0;
    135 
    136   // Add |server| into the persistent store. Should only be called from IO
    137   // thread.
    138   virtual void SetSupportsSpdy(const HostPortPair& server,
    139                                bool support_spdy) = 0;
    140 
    141   // Returns true if |server| has an Alternate-Protocol header.
    142   virtual bool HasAlternateProtocol(const HostPortPair& server) = 0;
    143 
    144   // Returns the Alternate-Protocol and port for |server|.
    145   // HasAlternateProtocol(server) must be true.
    146   virtual PortAlternateProtocolPair GetAlternateProtocol(
    147       const HostPortPair& server) = 0;
    148 
    149   // Sets the Alternate-Protocol for |server|.
    150   virtual void SetAlternateProtocol(const HostPortPair& server,
    151                                     uint16 alternate_port,
    152                                     AlternateProtocol alternate_protocol) = 0;
    153 
    154   // Sets the Alternate-Protocol for |server| to be BROKEN.
    155   virtual void SetBrokenAlternateProtocol(const HostPortPair& server) = 0;
    156 
    157   // Returns true if Alternate-Protocol for |server| was recently BROKEN.
    158   virtual bool WasAlternateProtocolRecentlyBroken(
    159       const HostPortPair& server) = 0;
    160 
    161   // Confirms that Alternate-Protocol for |server| is working.
    162   virtual void ConfirmAlternateProtocol(const HostPortPair& server) = 0;
    163 
    164   // Clears the Alternate-Protocol for |server|.
    165   virtual void ClearAlternateProtocol(const HostPortPair& server) = 0;
    166 
    167   // Returns all Alternate-Protocol mappings.
    168   virtual const AlternateProtocolMap& alternate_protocol_map() const = 0;
    169 
    170   virtual void SetAlternateProtocolExperiment(
    171       AlternateProtocolExperiment experiment) = 0;
    172 
    173   virtual AlternateProtocolExperiment GetAlternateProtocolExperiment()
    174       const = 0;
    175 
    176   // Gets a reference to the SettingsMap stored for a host.
    177   // If no settings are stored, returns an empty SettingsMap.
    178   virtual const SettingsMap& GetSpdySettings(
    179       const HostPortPair& host_port_pair) = 0;
    180 
    181   // Saves an individual SPDY setting for a host. Returns true if SPDY setting
    182   // is to be persisted.
    183   virtual bool SetSpdySetting(const HostPortPair& host_port_pair,
    184                               SpdySettingsIds id,
    185                               SpdySettingsFlags flags,
    186                               uint32 value) = 0;
    187 
    188   // Clears all SPDY settings for a host.
    189   virtual void ClearSpdySettings(const HostPortPair& host_port_pair) = 0;
    190 
    191   // Clears all SPDY settings for all hosts.
    192   virtual void ClearAllSpdySettings() = 0;
    193 
    194   // Returns all persistent SPDY settings.
    195   virtual const SpdySettingsMap& spdy_settings_map() const = 0;
    196 
    197   virtual void SetServerNetworkStats(const HostPortPair& host_port_pair,
    198                                      NetworkStats stats) = 0;
    199 
    200   virtual const NetworkStats* GetServerNetworkStats(
    201       const HostPortPair& host_port_pair) const = 0;
    202 
    203  private:
    204   DISALLOW_COPY_AND_ASSIGN(HttpServerProperties);
    205 };
    206 
    207 }  // namespace net
    208 
    209 #endif  // NET_HTTP_HTTP_SERVER_PROPERTIES_H_
    210