Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / net / http / http_server_properties.cc
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/metrics/histogram.h"
9 #include "base/strings/stringprintf.h"
10
11 namespace net {
12
13 const char kAlternateProtocolHeader[] = "Alternate-Protocol";
14
15 namespace {
16
17 // The order of these strings much match the order of the enum definition
18 // for AlternateProtocol.
19 const char* const kAlternateProtocolStrings[] = {
20   "npn-spdy/2",
21   "npn-spdy/3",
22   "npn-spdy/3.1",
23   "npn-h2-14",  // HTTP/2 draft 14. Called SPDY4 internally.
24   "quic"
25 };
26 const char kBrokenAlternateProtocol[] = "Broken";
27
28 COMPILE_ASSERT(
29     arraysize(kAlternateProtocolStrings) == NUM_VALID_ALTERNATE_PROTOCOLS,
30     kAlternateProtocolStringsSize_kNumValidAlternateProtocols_not_equal);
31
32 }  // namespace
33
34 void HistogramAlternateProtocolUsage(
35     AlternateProtocolUsage usage,
36     AlternateProtocolExperiment alternate_protocol_experiment) {
37   UMA_HISTOGRAM_ENUMERATION("Net.AlternateProtocolUsage", usage,
38                             ALTERNATE_PROTOCOL_USAGE_MAX);
39   if (alternate_protocol_experiment ==
40       ALTERNATE_PROTOCOL_TRUNCATED_200_SERVERS) {
41     UMA_HISTOGRAM_ENUMERATION("Net.AlternateProtocolUsage.200Truncated", usage,
42                               ALTERNATE_PROTOCOL_USAGE_MAX);
43   } else if (alternate_protocol_experiment ==
44       ALTERNATE_PROTOCOL_TRUNCATED_1000_SERVERS) {
45     UMA_HISTOGRAM_ENUMERATION("Net.AlternateProtocolUsage.1000Truncated", usage,
46                               ALTERNATE_PROTOCOL_USAGE_MAX);
47   }
48 }
49
50 void HistogramBrokenAlternateProtocolLocation(
51     BrokenAlternateProtocolLocation location){
52   UMA_HISTOGRAM_ENUMERATION("Net.AlternateProtocolBrokenLocation", location,
53                             BROKEN_ALTERNATE_PROTOCOL_LOCATION_MAX);
54 }
55
56 bool IsAlternateProtocolValid(AlternateProtocol protocol) {
57   return protocol >= ALTERNATE_PROTOCOL_MINIMUM_VALID_VERSION &&
58       protocol <= ALTERNATE_PROTOCOL_MAXIMUM_VALID_VERSION;
59 }
60
61 const char* AlternateProtocolToString(AlternateProtocol protocol) {
62   switch (protocol) {
63     case DEPRECATED_NPN_SPDY_2:
64     case NPN_SPDY_3:
65     case NPN_SPDY_3_1:
66     case NPN_SPDY_4:
67     case QUIC:
68       DCHECK(IsAlternateProtocolValid(protocol));
69       return kAlternateProtocolStrings[
70           protocol - ALTERNATE_PROTOCOL_MINIMUM_VALID_VERSION];
71     case ALTERNATE_PROTOCOL_BROKEN:
72       return kBrokenAlternateProtocol;
73     case UNINITIALIZED_ALTERNATE_PROTOCOL:
74       return "Uninitialized";
75   }
76   NOTREACHED();
77   return "";
78 }
79
80 AlternateProtocol AlternateProtocolFromString(const std::string& str) {
81   for (int i = ALTERNATE_PROTOCOL_MINIMUM_VALID_VERSION;
82        i <= ALTERNATE_PROTOCOL_MAXIMUM_VALID_VERSION; ++i) {
83     AlternateProtocol protocol = static_cast<AlternateProtocol>(i);
84     if (str == AlternateProtocolToString(protocol))
85       return protocol;
86   }
87   if (str == kBrokenAlternateProtocol)
88     return ALTERNATE_PROTOCOL_BROKEN;
89   return UNINITIALIZED_ALTERNATE_PROTOCOL;
90 }
91
92 AlternateProtocol AlternateProtocolFromNextProto(NextProto next_proto) {
93   switch (next_proto) {
94     case kProtoDeprecatedSPDY2:
95       return DEPRECATED_NPN_SPDY_2;
96     case kProtoSPDY3:
97       return NPN_SPDY_3;
98     case kProtoSPDY31:
99       return NPN_SPDY_3_1;
100     case kProtoSPDY4:
101       return NPN_SPDY_4;
102     case kProtoQUIC1SPDY3:
103       return QUIC;
104
105     case kProtoUnknown:
106     case kProtoHTTP11:
107       break;
108   }
109
110   NOTREACHED() << "Invalid NextProto: " << next_proto;
111   return UNINITIALIZED_ALTERNATE_PROTOCOL;
112 }
113
114 std::string AlternateProtocolInfo::ToString() const {
115   return base::StringPrintf("%d:%s p=%f", port,
116                             AlternateProtocolToString(protocol),
117                             probability);
118 }
119
120 }  // namespace net