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/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