blob: cea073214d61e7545c8bc1ccbece993c359ed0bb [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"
asvitkinec3c93722015-06-17 14:48:378#include "base/metrics/histogram_macros.h"
[email protected]125ef482013-06-11 18:32:479#include "base/strings/stringprintf.h"
zhongyie537a002017-06-27 16:48:2110#include "net/http/http_network_session.h"
bncfacdd852015-01-09 19:22:5411#include "net/socket/ssl_client_socket.h"
12#include "net/ssl/ssl_config.h"
[email protected]17291a022011-10-10 07:32:5313
14namespace net {
15
zhongyi7935a552016-09-27 00:57:2316namespace {
17
18enum AlternativeProxyUsage {
19 // Alternative Proxy was used without racing a normal connection.
20 ALTERNATIVE_PROXY_USAGE_NO_RACE = 0,
21 // Alternative Proxy was used by winning a race with a normal connection.
22 ALTERNATIVE_PROXY_USAGE_WON_RACE = 1,
23 // Alternative Proxy was not used by losing a race with a normal connection.
24 ALTERNATIVE_PROXY_USAGE_LOST_RACE = 2,
25 // Maximum value for the enum.
26 ALTERNATIVE_PROXY_USAGE_MAX,
27};
28
29AlternativeProxyUsage ConvertProtocolUsageToProxyUsage(
30 AlternateProtocolUsage usage) {
31 switch (usage) {
32 case ALTERNATE_PROTOCOL_USAGE_NO_RACE:
33 return ALTERNATIVE_PROXY_USAGE_NO_RACE;
34 case ALTERNATE_PROTOCOL_USAGE_WON_RACE:
35 return ALTERNATIVE_PROXY_USAGE_WON_RACE;
36 case ALTERNATE_PROTOCOL_USAGE_LOST_RACE:
37 return ALTERNATIVE_PROXY_USAGE_LOST_RACE;
38 default:
39 NOTREACHED();
40 return ALTERNATIVE_PROXY_USAGE_MAX;
41 }
42}
43
bncd479b3c2017-05-24 18:54:5344} // anonymous namespace
zhongyi7935a552016-09-27 00:57:2345
bncc958faa2015-07-31 18:14:5246const char kAlternativeServiceHeader[] = "Alt-Svc";
[email protected]88a332622013-07-30 07:13:3247
zhongyi7935a552016-09-27 00:57:2348void HistogramAlternateProtocolUsage(AlternateProtocolUsage usage,
49 bool proxy_server_used) {
50 if (proxy_server_used) {
51 DCHECK_LE(usage, ALTERNATE_PROTOCOL_USAGE_LOST_RACE);
52 UMA_HISTOGRAM_ENUMERATION("Net.QuicAlternativeProxy.Usage",
53 ConvertProtocolUsageToProxyUsage(usage),
54 ALTERNATIVE_PROXY_USAGE_MAX);
55 } else {
56 UMA_HISTOGRAM_ENUMERATION("Net.AlternateProtocolUsage", usage,
57 ALTERNATE_PROTOCOL_USAGE_MAX);
58 }
[email protected]db9bfea2014-04-11 18:51:3959}
60
[email protected]7b33037f2014-04-11 23:00:2861void HistogramBrokenAlternateProtocolLocation(
62 BrokenAlternateProtocolLocation location){
63 UMA_HISTOGRAM_ENUMERATION("Net.AlternateProtocolBrokenLocation", location,
64 BROKEN_ALTERNATE_PROTOCOL_LOCATION_MAX);
65}
66
bnc3472afd2016-11-17 15:27:2167bool IsAlternateProtocolValid(NextProto protocol) {
bnc8f8225c2016-09-23 21:19:4668 switch (protocol) {
bnc3472afd2016-11-17 15:27:2169 case kProtoUnknown:
bnce1a722c2016-11-11 16:38:0670 return false;
bnc3472afd2016-11-17 15:27:2171 case kProtoHTTP11:
72 return false;
73 case kProtoHTTP2:
74 return true;
75 case kProtoQUIC:
76 return true;
bnc8f8225c2016-09-23 21:19:4677 }
78 NOTREACHED();
79 return false;
[email protected]13621d62013-10-04 18:39:2180}
81
zhongyie537a002017-06-27 16:48:2182// static
83AlternativeServiceInfo
84AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
85 const AlternativeService& alternative_service,
86 base::Time expiration) {
87 DCHECK_EQ(alternative_service.protocol, kProtoHTTP2);
88 return AlternativeServiceInfo(alternative_service, expiration,
Nick Harper23290b82019-05-02 00:02:5689 quic::ParsedQuicVersionVector());
zhongyie537a002017-06-27 16:48:2190}
91
92// static
93AlternativeServiceInfo AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
94 const AlternativeService& alternative_service,
95 base::Time expiration,
Nick Harper23290b82019-05-02 00:02:5696 const quic::ParsedQuicVersionVector& advertised_versions) {
zhongyie537a002017-06-27 16:48:2197 DCHECK_EQ(alternative_service.protocol, kProtoQUIC);
98 return AlternativeServiceInfo(alternative_service, expiration,
99 advertised_versions);
100}
101
zhongyi422ce352017-06-09 23:28:54102AlternativeServiceInfo::AlternativeServiceInfo() : alternative_service_() {}
103
Chris Watkins7a41d3552017-12-01 02:13:27104AlternativeServiceInfo::~AlternativeServiceInfo() = default;
zhongyie537a002017-06-27 16:48:21105
zhongyi422ce352017-06-09 23:28:54106AlternativeServiceInfo::AlternativeServiceInfo(
107 const AlternativeService& alternative_service,
zhongyie537a002017-06-27 16:48:21108 base::Time expiration,
Nick Harper23290b82019-05-02 00:02:56109 const quic::ParsedQuicVersionVector& advertised_versions)
zhongyie537a002017-06-27 16:48:21110 : alternative_service_(alternative_service), expiration_(expiration) {
111 if (alternative_service_.protocol == kProtoQUIC) {
112 advertised_versions_ = advertised_versions;
Nick Harper23290b82019-05-02 00:02:56113 std::sort(advertised_versions_.begin(), advertised_versions_.end(),
114 TransportVersionLessThan);
zhongyie537a002017-06-27 16:48:21115 }
116}
zhongyi422ce352017-06-09 23:28:54117
118AlternativeServiceInfo::AlternativeServiceInfo(
119 const AlternativeServiceInfo& alternative_service_info) = default;
120
121AlternativeServiceInfo& AlternativeServiceInfo::operator=(
122 const AlternativeServiceInfo& alternative_service_info) = default;
123
bnc4988e432015-03-31 03:06:25124std::string AlternativeService::ToString() const {
bnc3472afd2016-11-17 15:27:21125 return base::StringPrintf("%s %s:%d", NextProtoToString(protocol),
bnc4988e432015-03-31 03:06:25126 host.c_str(), port);
127}
128
129std::string AlternativeServiceInfo::ToString() const {
bnce4f571c2015-12-10 20:10:37130 base::Time::Exploded exploded;
zhongyi422ce352017-06-09 23:28:54131 expiration_.LocalExplode(&exploded);
rchdc7b9052016-03-17 20:51:50132 return base::StringPrintf(
133 "%s, expires %04d-%02d-%02d %02d:%02d:%02d",
zhongyi422ce352017-06-09 23:28:54134 alternative_service_.ToString().c_str(), exploded.year, exploded.month,
rchdc7b9052016-03-17 20:51:50135 exploded.day_of_month, exploded.hour, exploded.minute, exploded.second);
[email protected]17291a022011-10-10 07:32:53136}
137
Nick Harper23290b82019-05-02 00:02:56138// static
139bool AlternativeServiceInfo::TransportVersionLessThan(
140 const quic::ParsedQuicVersion& lhs,
141 const quic::ParsedQuicVersion& rhs) {
142 return lhs.transport_version < rhs.transport_version;
143}
144
bnc396d33b2017-04-10 16:40:18145std::ostream& operator<<(std::ostream& os,
146 const AlternativeService& alternative_service) {
147 os << alternative_service.ToString();
148 return os;
149}
150
bncfacdd852015-01-09 19:22:54151// static
152void HttpServerProperties::ForceHTTP11(SSLConfig* ssl_config) {
bnc1f295372015-10-21 23:24:22153 ssl_config->alpn_protos.clear();
154 ssl_config->alpn_protos.push_back(kProtoHTTP11);
bncfacdd852015-01-09 19:22:54155}
156
[email protected]17291a022011-10-10 07:32:53157} // namespace net