// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // HttpAlternateProtocols is an in-memory data structure used for keeping track // of which HTTP HostPortPairs have an alternate protocol that can be used // instead of HTTP on a different port. #ifndef NET_HTTP_HTTP_ALTERNATE_PROTOCOLS_H_ #define NET_HTTP_HTTP_ALTERNATE_PROTOCOLS_H_ #pragma once #include <map> #include <string> #include <utility> #include "base/basictypes.h" #include "net/base/host_port_pair.h" namespace net { class HttpAlternateProtocols { public: enum Protocol { NPN_SPDY_1, NPN_SPDY_2, NUM_ALTERNATE_PROTOCOLS, BROKEN, // The alternate protocol is known to be broken. UNINITIALIZED, }; struct PortProtocolPair { bool Equals(const PortProtocolPair& other) const { return port == other.port && protocol == other.protocol; } std::string ToString() const; uint16 port; Protocol protocol; }; typedef std::map<HostPortPair, PortProtocolPair> ProtocolMap; static const char kHeader[]; static const char* const kProtocolStrings[NUM_ALTERNATE_PROTOCOLS]; HttpAlternateProtocols(); ~HttpAlternateProtocols(); // Reports whether or not we have received Alternate-Protocol for // |http_host_port_pair|. bool HasAlternateProtocolFor(const HostPortPair& http_host_port_pair) const; bool HasAlternateProtocolFor(const std::string& host, uint16 port) const; PortProtocolPair GetAlternateProtocolFor( const HostPortPair& http_host_port_pair) const; PortProtocolPair GetAlternateProtocolFor( const std::string& host, uint16 port) const; // SetAlternateProtocolFor() will ignore the request if the alternate protocol // has already been marked broken via MarkBrokenAlternateProtocolFor(). void SetAlternateProtocolFor(const HostPortPair& http_host_port_pair, uint16 alternate_port, Protocol alternate_protocol); // Marks the alternate protocol as broken. Once marked broken, any further // attempts to set the alternate protocol for |http_host_port_pair| will fail. void MarkBrokenAlternateProtocolFor(const HostPortPair& http_host_port_pair); const ProtocolMap& protocol_map() const { return protocol_map_; } // Debugging to simulate presence of an AlternateProtocol. // If we don't have an alternate protocol in the map for any given host/port // pair, force this ProtocolPortPair. static void ForceAlternateProtocol(const PortProtocolPair& pair); static void DisableForcedAlternateProtocol(); private: ProtocolMap protocol_map_; static const char* ProtocolToString(Protocol protocol); // The forced alternate protocol. If not-null, there is a protocol being // forced. static PortProtocolPair* forced_alternate_protocol_; DISALLOW_COPY_AND_ASSIGN(HttpAlternateProtocols); }; } // namespace net #endif // NET_HTTP_HTTP_ALTERNATE_PROTOCOLS_H_