blob: af972dfa194b24282fe84155b527f10e5bb97a23 [file] [log] [blame]
[email protected]39c48fc2012-03-12 18:42:121// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]17291a022011-10-10 07:32:532// 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"
[email protected]125ef482013-06-11 18:32:478#include "base/strings/stringprintf.h"
[email protected]17291a022011-10-10 07:32:539
10namespace net {
11
12const char kAlternateProtocolHeader[] = "Alternate-Protocol";
[email protected]88a332622013-07-30 07:13:3213
14namespace {
15
[email protected]61a527782013-02-21 03:58:0016// The order of these strings much match the order of the enum definition
17// for AlternateProtocol.
[email protected]17291a022011-10-10 07:32:5318const char* const kAlternateProtocolStrings[] = {
[email protected]17291a022011-10-10 07:32:5319 "npn-spdy/2",
[email protected]39c48fc2012-03-12 18:42:1220 "npn-spdy/3",
[email protected]63bf9662013-03-05 20:46:0121 "npn-spdy/3.1",
[email protected]d5b42bdd2013-05-15 20:42:3622 "npn-spdy/4a2",
[email protected]88a332622013-07-30 07:13:3223 "npn-HTTP-draft-04/2.0",
[email protected]7db54b82013-04-01 21:53:4524 "quic"
[email protected]17291a022011-10-10 07:32:5325};
[email protected]04af25f62012-04-10 19:11:3926const char kBrokenAlternateProtocol[] = "Broken";
[email protected]17291a022011-10-10 07:32:5327
[email protected]13621d62013-10-04 18:39:2128COMPILE_ASSERT(
29 arraysize(kAlternateProtocolStrings) == NUM_VALID_ALTERNATE_PROTOCOLS,
30 kAlternateProtocolStringsSize_kNumValidAlternateProtocols_not_equal);
[email protected]88a332622013-07-30 07:13:3231
32} // namespace
33
[email protected]13621d62013-10-04 18:39:2134bool IsAlternateProtocolValid(AlternateProtocol protocol) {
35 return protocol >= ALTERNATE_PROTOCOL_MINIMUM_VALID_VERSION &&
36 protocol <= ALTERNATE_PROTOCOL_MAXIMUM_VALID_VERSION;
37}
38
[email protected]04af25f62012-04-10 19:11:3939const char* AlternateProtocolToString(AlternateProtocol protocol) {
[email protected]17291a022011-10-10 07:32:5340 switch (protocol) {
[email protected]17291a022011-10-10 07:32:5341 case NPN_SPDY_2:
[email protected]39c48fc2012-03-12 18:42:1242 case NPN_SPDY_3:
[email protected]8a0fc822013-06-27 20:52:4343 case NPN_SPDY_3_1:
44 case NPN_SPDY_4A2:
[email protected]88a332622013-07-30 07:13:3245 case NPN_HTTP2_DRAFT_04:
[email protected]7db54b82013-04-01 21:53:4546 case QUIC:
[email protected]13621d62013-10-04 18:39:2147 DCHECK(IsAlternateProtocolValid(protocol));
48 return kAlternateProtocolStrings[
49 protocol - ALTERNATE_PROTOCOL_MINIMUM_VALID_VERSION];
[email protected]17291a022011-10-10 07:32:5350 case ALTERNATE_PROTOCOL_BROKEN:
[email protected]04af25f62012-04-10 19:11:3951 return kBrokenAlternateProtocol;
[email protected]17291a022011-10-10 07:32:5352 case UNINITIALIZED_ALTERNATE_PROTOCOL:
53 return "Uninitialized";
[email protected]17291a022011-10-10 07:32:5354 }
[email protected]88a332622013-07-30 07:13:3255 NOTREACHED();
56 return "";
[email protected]17291a022011-10-10 07:32:5357}
58
[email protected]13621d62013-10-04 18:39:2159AlternateProtocol AlternateProtocolFromString(const std::string& str) {
60 for (int i = ALTERNATE_PROTOCOL_MINIMUM_VALID_VERSION;
61 i <= ALTERNATE_PROTOCOL_MAXIMUM_VALID_VERSION; ++i) {
62 AlternateProtocol protocol = static_cast<AlternateProtocol>(i);
63 if (str == AlternateProtocolToString(protocol))
64 return protocol;
65 }
66 if (str == kBrokenAlternateProtocol)
[email protected]04af25f62012-04-10 19:11:3967 return ALTERNATE_PROTOCOL_BROKEN;
68 return UNINITIALIZED_ALTERNATE_PROTOCOL;
69}
70
[email protected]0ce3af82013-07-22 16:17:1671AlternateProtocol AlternateProtocolFromNextProto(NextProto next_proto) {
72 switch (next_proto) {
73 case kProtoSPDY2:
74 return NPN_SPDY_2;
75 case kProtoSPDY3:
76 return NPN_SPDY_3;
77 case kProtoSPDY31:
78 return NPN_SPDY_3_1;
79 case kProtoSPDY4a2:
80 return NPN_SPDY_4A2;
[email protected]88a332622013-07-30 07:13:3281 case kProtoHTTP2Draft04:
82 return NPN_HTTP2_DRAFT_04;
[email protected]0ce3af82013-07-22 16:17:1683 case kProtoQUIC1SPDY3:
84 return QUIC;
85
86 case kProtoUnknown:
87 case kProtoHTTP11:
[email protected]0ce3af82013-07-22 16:17:1688 break;
89 }
90
91 NOTREACHED() << "Invalid NextProto: " << next_proto;
92 return UNINITIALIZED_ALTERNATE_PROTOCOL;
93}
[email protected]04af25f62012-04-10 19:11:3994
[email protected]17291a022011-10-10 07:32:5395std::string PortAlternateProtocolPair::ToString() const {
96 return base::StringPrintf("%d:%s", port,
97 AlternateProtocolToString(protocol));
98}
99
[email protected]17291a022011-10-10 07:32:53100} // namespace net