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#include "net/http/http_server_properties.h" 6 7#include "base/logging.h" 8#include "base/strings/stringprintf.h" 9 10namespace net { 11 12const char kAlternateProtocolHeader[] = "Alternate-Protocol"; 13 14namespace { 15 16// The order of these strings much match the order of the enum definition 17// for AlternateProtocol. 18const char* const kAlternateProtocolStrings[] = { 19 "npn-spdy/2", 20 "npn-spdy/3", 21 "npn-spdy/3.1", 22 "npn-spdy/4a2", 23 "npn-HTTP-draft-04/2.0", 24 "quic" 25}; 26const char kBrokenAlternateProtocol[] = "Broken"; 27 28COMPILE_ASSERT( 29 arraysize(kAlternateProtocolStrings) == NUM_VALID_ALTERNATE_PROTOCOLS, 30 kAlternateProtocolStringsSize_kNumValidAlternateProtocols_not_equal); 31 32} // namespace 33 34bool IsAlternateProtocolValid(AlternateProtocol protocol) { 35 return protocol >= ALTERNATE_PROTOCOL_MINIMUM_VALID_VERSION && 36 protocol <= ALTERNATE_PROTOCOL_MAXIMUM_VALID_VERSION; 37} 38 39const char* AlternateProtocolToString(AlternateProtocol protocol) { 40 switch (protocol) { 41 case DEPRECATED_NPN_SPDY_2: 42 case NPN_SPDY_3: 43 case NPN_SPDY_3_1: 44 case NPN_SPDY_4A2: 45 case NPN_HTTP2_DRAFT_04: 46 case QUIC: 47 DCHECK(IsAlternateProtocolValid(protocol)); 48 return kAlternateProtocolStrings[ 49 protocol - ALTERNATE_PROTOCOL_MINIMUM_VALID_VERSION]; 50 case ALTERNATE_PROTOCOL_BROKEN: 51 return kBrokenAlternateProtocol; 52 case UNINITIALIZED_ALTERNATE_PROTOCOL: 53 return "Uninitialized"; 54 } 55 NOTREACHED(); 56 return ""; 57} 58 59AlternateProtocol AlternateProtocolFromString(const std::string& str) { 60 for (int i = ALTERNATE_PROTOCOL_MINIMUM_VALID_VERSION; 61 i <= ALTERNATE_PROTOCOL_MAXIMUM_VALID_VERSION; ++i) { 62 AlternateProtocol protocol = static_cast<AlternateProtocol>(i); 63 if (str == AlternateProtocolToString(protocol)) 64 return protocol; 65 } 66 if (str == kBrokenAlternateProtocol) 67 return ALTERNATE_PROTOCOL_BROKEN; 68 return UNINITIALIZED_ALTERNATE_PROTOCOL; 69} 70 71AlternateProtocol AlternateProtocolFromNextProto(NextProto next_proto) { 72 switch (next_proto) { 73 case kProtoDeprecatedSPDY2: 74 return DEPRECATED_NPN_SPDY_2; 75 case kProtoSPDY3: 76 return NPN_SPDY_3; 77 case kProtoSPDY31: 78 return NPN_SPDY_3_1; 79 case kProtoSPDY4a2: 80 return NPN_SPDY_4A2; 81 case kProtoHTTP2Draft04: 82 return NPN_HTTP2_DRAFT_04; 83 case kProtoQUIC1SPDY3: 84 return QUIC; 85 86 case kProtoUnknown: 87 case kProtoHTTP11: 88 break; 89 } 90 91 NOTREACHED() << "Invalid NextProto: " << next_proto; 92 return UNINITIALIZED_ALTERNATE_PROTOCOL; 93} 94 95std::string PortAlternateProtocolPair::ToString() const { 96 return base::StringPrintf("%d:%s", port, 97 AlternateProtocolToString(protocol)); 98} 99 100} // namespace net 101