Home | History | Annotate | Download | only in http
      1 // Copyright (c) 2010 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 // HttpAlternateProtocols is an in-memory data structure used for keeping track
      6 // of which HTTP HostPortPairs have an alternate protocol that can be used
      7 // instead of HTTP on a different port.
      8 
      9 #ifndef NET_HTTP_HTTP_ALTERNATE_PROTOCOLS_H_
     10 #define NET_HTTP_HTTP_ALTERNATE_PROTOCOLS_H_
     11 #pragma once
     12 
     13 #include <map>
     14 #include <string>
     15 #include <utility>
     16 
     17 #include "base/basictypes.h"
     18 #include "net/base/host_port_pair.h"
     19 
     20 namespace net {
     21 
     22 class HttpAlternateProtocols {
     23  public:
     24   enum Protocol {
     25     NPN_SPDY_1,
     26     NPN_SPDY_2,
     27     NUM_ALTERNATE_PROTOCOLS,
     28     BROKEN,  // The alternate protocol is known to be broken.
     29     UNINITIALIZED,
     30   };
     31 
     32   struct PortProtocolPair {
     33     bool Equals(const PortProtocolPair& other) const {
     34       return port == other.port && protocol == other.protocol;
     35     }
     36 
     37     std::string ToString() const;
     38 
     39     uint16 port;
     40     Protocol protocol;
     41   };
     42 
     43   typedef std::map<HostPortPair, PortProtocolPair> ProtocolMap;
     44 
     45   static const char kHeader[];
     46   static const char* const kProtocolStrings[NUM_ALTERNATE_PROTOCOLS];
     47 
     48   HttpAlternateProtocols();
     49   ~HttpAlternateProtocols();
     50 
     51   // Reports whether or not we have received Alternate-Protocol for
     52   // |http_host_port_pair|.
     53   bool HasAlternateProtocolFor(const HostPortPair& http_host_port_pair) const;
     54   bool HasAlternateProtocolFor(const std::string& host, uint16 port) const;
     55 
     56   PortProtocolPair GetAlternateProtocolFor(
     57       const HostPortPair& http_host_port_pair) const;
     58   PortProtocolPair GetAlternateProtocolFor(
     59       const std::string& host, uint16 port) const;
     60 
     61   // SetAlternateProtocolFor() will ignore the request if the alternate protocol
     62   // has already been marked broken via MarkBrokenAlternateProtocolFor().
     63   void SetAlternateProtocolFor(const HostPortPair& http_host_port_pair,
     64                                uint16 alternate_port,
     65                                Protocol alternate_protocol);
     66 
     67   // Marks the alternate protocol as broken.  Once marked broken, any further
     68   // attempts to set the alternate protocol for |http_host_port_pair| will fail.
     69   void MarkBrokenAlternateProtocolFor(const HostPortPair& http_host_port_pair);
     70 
     71   const ProtocolMap& protocol_map() const { return protocol_map_; }
     72 
     73   // Debugging to simulate presence of an AlternateProtocol.
     74   // If we don't have an alternate protocol in the map for any given host/port
     75   // pair, force this ProtocolPortPair.
     76   static void ForceAlternateProtocol(const PortProtocolPair& pair);
     77   static void DisableForcedAlternateProtocol();
     78 
     79  private:
     80   ProtocolMap protocol_map_;
     81 
     82   static const char* ProtocolToString(Protocol protocol);
     83 
     84   // The forced alternate protocol.  If not-null, there is a protocol being
     85   // forced.
     86   static PortProtocolPair* forced_alternate_protocol_;
     87 
     88   DISALLOW_COPY_AND_ASSIGN(HttpAlternateProtocols);
     89 };
     90 
     91 }  // namespace net
     92 
     93 #endif  // NET_HTTP_HTTP_ALTERNATE_PROTOCOLS_H_
     94