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