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.
5 #include "net/http/http_server_properties.h"
7 #include "base/logging.h"
8 #include "base/metrics/histogram.h"
9 #include "base/strings/stringprintf.h"
13 const char kAlternateProtocolHeader[] = "Alternate-Protocol";
17 // The order of these strings much match the order of the enum definition
18 // for AlternateProtocol.
19 const char* const kAlternateProtocolStrings[] = {
23 "npn-h2-11", // HTTP/2 draft 11. Called SPDY4 internally.
26 const char kBrokenAlternateProtocol[] = "Broken";
29 arraysize(kAlternateProtocolStrings) == NUM_VALID_ALTERNATE_PROTOCOLS,
30 kAlternateProtocolStringsSize_kNumValidAlternateProtocols_not_equal);
34 void HistogramAlternateProtocolUsage(AlternateProtocolUsage usage) {
35 UMA_HISTOGRAM_ENUMERATION("Net.AlternateProtocolUsage", usage,
36 ALTERNATE_PROTOCOL_USAGE_MAX);
39 void HistogramBrokenAlternateProtocolLocation(
40 BrokenAlternateProtocolLocation location){
41 UMA_HISTOGRAM_ENUMERATION("Net.AlternateProtocolBrokenLocation", location,
42 BROKEN_ALTERNATE_PROTOCOL_LOCATION_MAX);
45 bool IsAlternateProtocolValid(AlternateProtocol protocol) {
46 return protocol >= ALTERNATE_PROTOCOL_MINIMUM_VALID_VERSION &&
47 protocol <= ALTERNATE_PROTOCOL_MAXIMUM_VALID_VERSION;
50 const char* AlternateProtocolToString(AlternateProtocol protocol) {
52 case DEPRECATED_NPN_SPDY_2:
57 DCHECK(IsAlternateProtocolValid(protocol));
58 return kAlternateProtocolStrings[
59 protocol - ALTERNATE_PROTOCOL_MINIMUM_VALID_VERSION];
60 case ALTERNATE_PROTOCOL_BROKEN:
61 return kBrokenAlternateProtocol;
62 case UNINITIALIZED_ALTERNATE_PROTOCOL:
63 return "Uninitialized";
69 AlternateProtocol AlternateProtocolFromString(const std::string& str) {
70 for (int i = ALTERNATE_PROTOCOL_MINIMUM_VALID_VERSION;
71 i <= ALTERNATE_PROTOCOL_MAXIMUM_VALID_VERSION; ++i) {
72 AlternateProtocol protocol = static_cast<AlternateProtocol>(i);
73 if (str == AlternateProtocolToString(protocol))
76 if (str == kBrokenAlternateProtocol)
77 return ALTERNATE_PROTOCOL_BROKEN;
78 return UNINITIALIZED_ALTERNATE_PROTOCOL;
81 AlternateProtocol AlternateProtocolFromNextProto(NextProto next_proto) {
83 case kProtoDeprecatedSPDY2:
84 return DEPRECATED_NPN_SPDY_2;
91 case kProtoQUIC1SPDY3:
99 NOTREACHED() << "Invalid NextProto: " << next_proto;
100 return UNINITIALIZED_ALTERNATE_PROTOCOL;
103 std::string PortAlternateProtocolPair::ToString() const {
104 return base::StringPrintf("%d:%s", port,
105 AlternateProtocolToString(protocol));