Upstream version 7.36.149.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-11",  // HTTP/2 draft 11. 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(AlternateProtocolUsage usage) {
35   UMA_HISTOGRAM_ENUMERATION("Net.AlternateProtocolUsage", usage,
36                             ALTERNATE_PROTOCOL_USAGE_MAX);
37 }
38
39 void HistogramBrokenAlternateProtocolLocation(
40     BrokenAlternateProtocolLocation location){
41   UMA_HISTOGRAM_ENUMERATION("Net.AlternateProtocolBrokenLocation", location,
42                             BROKEN_ALTERNATE_PROTOCOL_LOCATION_MAX);
43 }
44
45 bool IsAlternateProtocolValid(AlternateProtocol protocol) {
46   return protocol >= ALTERNATE_PROTOCOL_MINIMUM_VALID_VERSION &&
47       protocol <= ALTERNATE_PROTOCOL_MAXIMUM_VALID_VERSION;
48 }
49
50 const char* AlternateProtocolToString(AlternateProtocol protocol) {
51   switch (protocol) {
52     case DEPRECATED_NPN_SPDY_2:
53     case NPN_SPDY_3:
54     case NPN_SPDY_3_1:
55     case NPN_SPDY_4:
56     case QUIC:
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";
64   }
65   NOTREACHED();
66   return "";
67 }
68
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))
74       return protocol;
75   }
76   if (str == kBrokenAlternateProtocol)
77     return ALTERNATE_PROTOCOL_BROKEN;
78   return UNINITIALIZED_ALTERNATE_PROTOCOL;
79 }
80
81 AlternateProtocol AlternateProtocolFromNextProto(NextProto next_proto) {
82   switch (next_proto) {
83     case kProtoDeprecatedSPDY2:
84       return DEPRECATED_NPN_SPDY_2;
85     case kProtoSPDY3:
86       return NPN_SPDY_3;
87     case kProtoSPDY31:
88       return NPN_SPDY_3_1;
89     case kProtoSPDY4:
90       return NPN_SPDY_4;
91     case kProtoQUIC1SPDY3:
92       return QUIC;
93
94     case kProtoUnknown:
95     case kProtoHTTP11:
96       break;
97   }
98
99   NOTREACHED() << "Invalid NextProto: " << next_proto;
100   return UNINITIALIZED_ALTERNATE_PROTOCOL;
101 }
102
103 std::string PortAlternateProtocolPair::ToString() const {
104   return base::StringPrintf("%d:%s", port,
105                             AlternateProtocolToString(protocol));
106 }
107
108 }  // namespace net