Home | History | Annotate | Download | only in http
      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
    121