Commit a9afeada authored by Yixin Wang's avatar Yixin Wang Committed by Commit Bot

Add support for parsing IETF format of alt-svc header advertising QUIC

This CL lands internal change 166256846 by wangyix.

BUG=488484

Change-Id: Idb25c187d402edc5e6c180c529fc3eede2c416bf
Reviewed-on: https://chromium-review.googlesource.com/620201
Commit-Queue: Yixin Wang <wangyix@chromium.org>
Reviewed-by: default avatarRyan Hamilton <rch@chromium.org>
Cr-Commit-Position: refs/heads/master@{#510184}
parent d4d78257
...@@ -145,6 +145,13 @@ bool ShouldRetryWithoutAltSvcOnQuicErrors( ...@@ -145,6 +145,13 @@ bool ShouldRetryWithoutAltSvcOnQuicErrors(
"true"); "true");
} }
bool ShouldSupportIetfFormatQuicAltSvc(
const VariationParameters& quic_trial_params) {
return base::LowerCaseEqualsASCII(
GetVariationParam(quic_trial_params, "support_ietf_format_quic_altsvc"),
"true");
}
net::QuicTagVector GetQuicConnectionOptions( net::QuicTagVector GetQuicConnectionOptions(
const VariationParameters& quic_trial_params) { const VariationParameters& quic_trial_params) {
VariationParameters::const_iterator it = VariationParameters::const_iterator it =
...@@ -268,6 +275,9 @@ void ConfigureQuicParams(base::StringPiece quic_trial_group, ...@@ -268,6 +275,9 @@ void ConfigureQuicParams(base::StringPiece quic_trial_group,
params->retry_without_alt_svc_on_quic_errors = params->retry_without_alt_svc_on_quic_errors =
ShouldRetryWithoutAltSvcOnQuicErrors(quic_trial_params); ShouldRetryWithoutAltSvcOnQuicErrors(quic_trial_params);
params->support_ietf_format_quic_altsvc =
ShouldSupportIetfFormatQuicAltSvc(quic_trial_params);
if (params->enable_quic) { if (params->enable_quic) {
params->quic_connection_options = params->quic_connection_options =
GetQuicConnectionOptions(quic_trial_params); GetQuicConnectionOptions(quic_trial_params);
......
...@@ -87,6 +87,7 @@ TEST_F(NetworkSessionConfiguratorTest, EnableQuicFromFieldTrialGroup) { ...@@ -87,6 +87,7 @@ TEST_F(NetworkSessionConfiguratorTest, EnableQuicFromFieldTrialGroup) {
EXPECT_TRUE(params_.enable_quic); EXPECT_TRUE(params_.enable_quic);
EXPECT_FALSE(params_.mark_quic_broken_when_network_blackholes); EXPECT_FALSE(params_.mark_quic_broken_when_network_blackholes);
EXPECT_FALSE(params_.retry_without_alt_svc_on_quic_errors); EXPECT_FALSE(params_.retry_without_alt_svc_on_quic_errors);
EXPECT_FALSE(params_.support_ietf_format_quic_altsvc);
EXPECT_EQ(1350u, params_.quic_max_packet_length); EXPECT_EQ(1350u, params_.quic_max_packet_length);
EXPECT_EQ(net::QuicTagVector(), params_.quic_connection_options); EXPECT_EQ(net::QuicTagVector(), params_.quic_connection_options);
EXPECT_EQ(net::QuicTagVector(), params_.quic_client_connection_options); EXPECT_EQ(net::QuicTagVector(), params_.quic_client_connection_options);
...@@ -150,6 +151,17 @@ TEST_F(NetworkSessionConfiguratorTest, RetryWithoutAltSvcOnQuicErrors) { ...@@ -150,6 +151,17 @@ TEST_F(NetworkSessionConfiguratorTest, RetryWithoutAltSvcOnQuicErrors) {
EXPECT_TRUE(params_.retry_without_alt_svc_on_quic_errors); EXPECT_TRUE(params_.retry_without_alt_svc_on_quic_errors);
} }
TEST_F(NetworkSessionConfiguratorTest, SupportIetfFormatQuicAltSvc) {
std::map<std::string, std::string> field_trial_params;
field_trial_params["support_ietf_format_quic_altsvc"] = "true";
variations::AssociateVariationParams("QUIC", "Enabled", field_trial_params);
base::FieldTrialList::CreateFieldTrial("QUIC", "Enabled");
ParseFieldTrials();
EXPECT_TRUE(params_.support_ietf_format_quic_altsvc);
}
TEST_F(NetworkSessionConfiguratorTest, TEST_F(NetworkSessionConfiguratorTest,
QuicIdleConnectionTimeoutSecondsFieldTrialParams) { QuicIdleConnectionTimeoutSecondsFieldTrialParams) {
std::map<std::string, std::string> field_trial_params; std::map<std::string, std::string> field_trial_params;
......
...@@ -112,6 +112,7 @@ HttpNetworkSession::Params::Params() ...@@ -112,6 +112,7 @@ HttpNetworkSession::Params::Params()
quic_max_server_configs_stored_in_properties(0u), quic_max_server_configs_stored_in_properties(0u),
mark_quic_broken_when_network_blackholes(false), mark_quic_broken_when_network_blackholes(false),
retry_without_alt_svc_on_quic_errors(false), retry_without_alt_svc_on_quic_errors(false),
support_ietf_format_quic_altsvc(false),
quic_idle_connection_timeout_seconds(kIdleConnectionTimeoutSeconds), quic_idle_connection_timeout_seconds(kIdleConnectionTimeoutSeconds),
quic_reduced_ping_timeout_seconds(kPingTimeoutSecs), quic_reduced_ping_timeout_seconds(kPingTimeoutSecs),
quic_connect_using_default_network(false), quic_connect_using_default_network(false),
...@@ -204,6 +205,7 @@ HttpNetworkSession::HttpNetworkSession(const Params& params, ...@@ -204,6 +205,7 @@ HttpNetworkSession::HttpNetworkSession(const Params& params,
context.transport_security_state, context.transport_security_state,
params.quic_supported_versions, params.quic_supported_versions,
params.enable_spdy_ping_based_connection_checking, params.enable_spdy_ping_based_connection_checking,
params.support_ietf_format_quic_altsvc,
params.spdy_session_max_recv_window_size, params.spdy_session_max_recv_window_size,
AddDefaultHttp2Settings(params.http2_settings), AddDefaultHttp2Settings(params.http2_settings),
params.time_func, params.time_func,
......
...@@ -144,6 +144,9 @@ class NET_EXPORT HttpNetworkSession : public base::MemoryCoordinatorClient { ...@@ -144,6 +144,9 @@ class NET_EXPORT HttpNetworkSession : public base::MemoryCoordinatorClient {
// Retry requests which fail with QUIC_PROTOCOL_ERROR, and mark QUIC // Retry requests which fail with QUIC_PROTOCOL_ERROR, and mark QUIC
// broken if the retry succeeds. // broken if the retry succeeds.
bool retry_without_alt_svc_on_quic_errors; bool retry_without_alt_svc_on_quic_errors;
// If true, alt-svc headers advertising QUIC in IETF format will be
// supported.
bool support_ietf_format_quic_altsvc;
// Specifies QUIC idle connection state lifetime. // Specifies QUIC idle connection state lifetime.
int quic_idle_connection_timeout_seconds; int quic_idle_connection_timeout_seconds;
// Specifies the reduced ping timeout subsequent connections should use when // Specifies the reduced ping timeout subsequent connections should use when
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "net/base/port_util.h" #include "net/base/port_util.h"
#include "net/http/http_network_session.h" #include "net/http/http_network_session.h"
#include "net/http/http_response_headers.h" #include "net/http/http_response_headers.h"
#include "net/quic/chromium/quic_http_utils.h"
#include "net/quic/core/quic_packets.h" #include "net/quic/core/quic_packets.h"
#include "net/spdy/core/spdy_alt_svc_wire_format.h" #include "net/spdy/core/spdy_alt_svc_wire_format.h"
#include "url/gurl.h" #include "url/gurl.h"
...@@ -54,19 +55,11 @@ void HttpStreamFactory::ProcessAlternativeServices( ...@@ -54,19 +55,11 @@ void HttpStreamFactory::ProcessAlternativeServices(
// Check if QUIC version is supported. Filter supported QUIC versions. // Check if QUIC version is supported. Filter supported QUIC versions.
QuicTransportVersionVector advertised_versions; QuicTransportVersionVector advertised_versions;
if (protocol == kProtoQUIC && !alternative_service_entry.version.empty()) { if (protocol == kProtoQUIC && !alternative_service_entry.version.empty()) {
bool match_found = false; advertised_versions = FilterSupportedAltSvcVersions(
for (QuicTransportVersion supported : alternative_service_entry, session->params().quic_supported_versions,
session->params().quic_supported_versions) { session->params().support_ietf_format_quic_altsvc);
for (uint16_t advertised : alternative_service_entry.version) { if (advertised_versions.empty())
if (supported == advertised) {
match_found = true;
advertised_versions.push_back(supported);
}
}
}
if (!match_found) {
continue; continue;
}
} }
AlternativeService alternative_service(protocol, AlternativeService alternative_service(protocol,
alternative_service_entry.host, alternative_service_entry.host,
......
...@@ -6,6 +6,8 @@ ...@@ -6,6 +6,8 @@
#include <utility> #include <utility>
#include "net/quic/platform/api/quic_endian.h"
namespace net { namespace net {
SpdyPriority ConvertRequestPriorityToQuicPriority( SpdyPriority ConvertRequestPriorityToQuicPriority(
...@@ -35,4 +37,34 @@ std::unique_ptr<base::Value> QuicRequestNetLogCallback( ...@@ -35,4 +37,34 @@ std::unique_ptr<base::Value> QuicRequestNetLogCallback(
return std::move(dict); return std::move(dict);
} }
QuicTransportVersionVector FilterSupportedAltSvcVersions(
const SpdyAltSvcWireFormat::AlternativeService& quic_alt_svc,
const QuicTransportVersionVector& supported_versions,
bool support_ietf_format_quic_altsvc) {
QuicTransportVersionVector supported_alt_svc_versions;
if (support_ietf_format_quic_altsvc && quic_alt_svc.protocol_id == "hq") {
// Using IETF format for advertising QUIC. In this case,
// |alternative_service_entry.version| will store QUIC version labels.
for (uint32_t quic_version_label : quic_alt_svc.version) {
for (QuicTransportVersion supported : supported_versions) {
QuicVersionLabel supported_version_label_network_order =
FLAGS_quic_reloadable_flag_quic_use_net_byte_order_version_label
? QuicVersionToQuicVersionLabel(supported)
: QuicEndian::HostToNet32(
QuicVersionToQuicVersionLabel(supported));
if (supported_version_label_network_order == quic_version_label)
supported_alt_svc_versions.push_back(supported);
}
}
} else if (quic_alt_svc.protocol_id == "quic") {
for (uint32_t quic_version : quic_alt_svc.version) {
for (QuicTransportVersion supported : supported_versions) {
if (static_cast<uint32_t>(supported) == quic_version)
supported_alt_svc_versions.push_back(supported);
}
}
}
return supported_alt_svc_versions;
}
} // namespace net } // namespace net
...@@ -27,6 +27,13 @@ NET_EXPORT std::unique_ptr<base::Value> QuicRequestNetLogCallback( ...@@ -27,6 +27,13 @@ NET_EXPORT std::unique_ptr<base::Value> QuicRequestNetLogCallback(
SpdyPriority priority, SpdyPriority priority,
NetLogCaptureMode capture_mode); NetLogCaptureMode capture_mode);
// Parses |alt_svc_versions| into a QuicTransportVersionVector and removes
// all entries that aren't found in |supported_versions|.
NET_EXPORT QuicTransportVersionVector FilterSupportedAltSvcVersions(
const SpdyAltSvcWireFormat::AlternativeService& quic_alt_svc,
const QuicTransportVersionVector& supported_versions,
bool support_ietf_format_quic_altsvc);
} // namespace net } // namespace net
#endif // NET_QUIC_CHROMIUM_QUIC_HTTP_UTILS_H_ #endif // NET_QUIC_CHROMIUM_QUIC_HTTP_UTILS_H_
...@@ -8,6 +8,8 @@ ...@@ -8,6 +8,8 @@
#include <limits> #include <limits>
#include "net/quic/platform/api/quic_endian.h"
#include "net/spdy/core/spdy_alt_svc_wire_format.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
namespace net { namespace net {
...@@ -35,5 +37,48 @@ TEST(QuicHttpUtilsTest, ConvertQuicPriorityToRequestPriority) { ...@@ -35,5 +37,48 @@ TEST(QuicHttpUtilsTest, ConvertQuicPriorityToRequestPriority) {
} }
} }
TEST(QuicHttpUtilsTest, FilterSupportedAltSvcVersions) {
QuicTransportVersionVector supported_versions = {
QUIC_VERSION_37, QUIC_VERSION_38, QUIC_VERSION_39, QUIC_VERSION_41};
std::vector<uint32_t> alt_svc_versions_google = {
QUIC_VERSION_38, QUIC_VERSION_41, QUIC_VERSION_42};
std::vector<uint32_t> alt_svc_versions_ietf = {
QuicVersionToQuicVersionLabel(QUIC_VERSION_38),
QuicVersionToQuicVersionLabel(QUIC_VERSION_41),
QuicVersionToQuicVersionLabel(QUIC_VERSION_42)};
if (!FLAGS_quic_reloadable_flag_quic_use_net_byte_order_version_label) {
for (uint32_t& version_label : alt_svc_versions_ietf) {
version_label = QuicEndian::HostToNet32(version_label);
}
}
QuicTransportVersionVector supported_alt_svc_versions = {QUIC_VERSION_38,
QUIC_VERSION_41};
SpdyAltSvcWireFormat::AlternativeService altsvc;
altsvc.protocol_id = "quic";
altsvc.version = alt_svc_versions_google;
EXPECT_EQ(supported_alt_svc_versions,
FilterSupportedAltSvcVersions(altsvc, supported_versions, true));
EXPECT_EQ(supported_alt_svc_versions,
FilterSupportedAltSvcVersions(altsvc, supported_versions, false));
altsvc.protocol_id = "hq";
altsvc.version = alt_svc_versions_ietf;
EXPECT_EQ(supported_alt_svc_versions,
FilterSupportedAltSvcVersions(altsvc, supported_versions, true));
EXPECT_EQ(QuicTransportVersionVector(),
FilterSupportedAltSvcVersions(altsvc, supported_versions, false));
altsvc.protocol_id = "invalid_protocol";
altsvc.version = alt_svc_versions_ietf;
EXPECT_EQ(QuicTransportVersionVector(),
FilterSupportedAltSvcVersions(altsvc, supported_versions, true));
EXPECT_EQ(QuicTransportVersionVector(),
FilterSupportedAltSvcVersions(altsvc, supported_versions, false));
}
} // namespace test } // namespace test
} // namespace net } // namespace net
...@@ -12,7 +12,7 @@ NextProto NextProtoFromString(base::StringPiece proto_string) { ...@@ -12,7 +12,7 @@ NextProto NextProtoFromString(base::StringPiece proto_string) {
if (proto_string == "h2") { if (proto_string == "h2") {
return kProtoHTTP2; return kProtoHTTP2;
} }
if (proto_string == "quic") if (proto_string == "quic" || proto_string == "hq")
return kProtoQUIC; return kProtoQUIC;
return kProtoUnknown; return kProtoUnknown;
......
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
#include "net/log/net_log_source_type.h" #include "net/log/net_log_source_type.h"
#include "net/log/net_log_with_source.h" #include "net/log/net_log_with_source.h"
#include "net/proxy/proxy_server.h" #include "net/proxy/proxy_server.h"
#include "net/quic/chromium/quic_http_utils.h"
#include "net/socket/socket.h" #include "net/socket/socket.h"
#include "net/socket/ssl_client_socket.h" #include "net/socket/ssl_client_socket.h"
#include "net/spdy/chromium/header_coalescer.h" #include "net/spdy/chromium/header_coalescer.h"
...@@ -727,6 +728,7 @@ SpdySession::SpdySession( ...@@ -727,6 +728,7 @@ SpdySession::SpdySession(
const QuicTransportVersionVector& quic_supported_versions, const QuicTransportVersionVector& quic_supported_versions,
bool enable_sending_initial_data, bool enable_sending_initial_data,
bool enable_ping_based_connection_checking, bool enable_ping_based_connection_checking,
bool support_ietf_format_quic_altsvc,
size_t session_max_recv_window_size, size_t session_max_recv_window_size,
const SettingsMap& initial_settings, const SettingsMap& initial_settings,
TimeFunc time_func, TimeFunc time_func,
...@@ -779,6 +781,7 @@ SpdySession::SpdySession( ...@@ -779,6 +781,7 @@ SpdySession::SpdySession(
enable_sending_initial_data_(enable_sending_initial_data), enable_sending_initial_data_(enable_sending_initial_data),
enable_ping_based_connection_checking_( enable_ping_based_connection_checking_(
enable_ping_based_connection_checking), enable_ping_based_connection_checking),
support_ietf_format_quic_altsvc_(support_ietf_format_quic_altsvc),
connection_at_risk_of_loss_time_( connection_at_risk_of_loss_time_(
base::TimeDelta::FromSeconds(kDefaultConnectionAtRiskOfLossSeconds)), base::TimeDelta::FromSeconds(kDefaultConnectionAtRiskOfLossSeconds)),
hung_interval_(base::TimeDelta::FromSeconds(kHungIntervalSeconds)), hung_interval_(base::TimeDelta::FromSeconds(kHungIntervalSeconds)),
...@@ -2964,25 +2967,13 @@ void SpdySession::OnAltSvc( ...@@ -2964,25 +2967,13 @@ void SpdySession::OnAltSvc(
if (protocol == kProtoUnknown) if (protocol == kProtoUnknown)
continue; continue;
// TODO(zhongyi): refactor the QUIC version filtering to a single function
// so that SpdySession::OnAltSvc and
// HttpStreamFactory::ProcessAlternativeServices
// could use the the same function.
// Check if QUIC version is supported. Filter supported QUIC versions. // Check if QUIC version is supported. Filter supported QUIC versions.
QuicTransportVersionVector advertised_versions; QuicTransportVersionVector advertised_versions;
if (protocol == kProtoQUIC && !altsvc.version.empty()) { if (protocol == kProtoQUIC && !altsvc.version.empty()) {
bool match_found = false; advertised_versions = FilterSupportedAltSvcVersions(
for (const QuicTransportVersion& supported : quic_supported_versions_) { altsvc, quic_supported_versions_, support_ietf_format_quic_altsvc_);
for (const uint16_t& advertised : altsvc.version) { if (advertised_versions.empty())
if (supported == advertised) {
match_found = true;
advertised_versions.push_back(supported);
}
}
}
if (!match_found) {
continue; continue;
}
} }
const AlternativeService alternative_service(protocol, altsvc.host, const AlternativeService alternative_service(protocol, altsvc.host,
......
...@@ -300,14 +300,14 @@ class NET_EXPORT SpdySession : public BufferedSpdyFramerVisitorInterface, ...@@ -300,14 +300,14 @@ class NET_EXPORT SpdySession : public BufferedSpdyFramerVisitorInterface,
// Create a new SpdySession. // Create a new SpdySession.
// |spdy_session_key| is the host/port that this session connects to, privacy // |spdy_session_key| is the host/port that this session connects to, privacy
// and proxy configuration settings that it's using. // and proxy configuration settings that it's using.
// |session| is the HttpNetworkSession. |net_log| is the NetLog that we log // |net_log| is the NetLog that we log network events to.
// network events to.
SpdySession(const SpdySessionKey& spdy_session_key, SpdySession(const SpdySessionKey& spdy_session_key,
HttpServerProperties* http_server_properties, HttpServerProperties* http_server_properties,
TransportSecurityState* transport_security_state, TransportSecurityState* transport_security_state,
const QuicTransportVersionVector& quic_supported_versions, const QuicTransportVersionVector& quic_supported_versions,
bool enable_sending_initial_data, bool enable_sending_initial_data,
bool enable_ping_based_connection_checking, bool enable_ping_based_connection_checking,
bool support_ietf_format_quic_altsvc,
size_t session_max_recv_window_size, size_t session_max_recv_window_size,
const SettingsMap& initial_settings, const SettingsMap& initial_settings,
TimeFunc time_func, TimeFunc time_func,
...@@ -1164,6 +1164,9 @@ class NET_EXPORT SpdySession : public BufferedSpdyFramerVisitorInterface, ...@@ -1164,6 +1164,9 @@ class NET_EXPORT SpdySession : public BufferedSpdyFramerVisitorInterface,
bool enable_sending_initial_data_; bool enable_sending_initial_data_;
bool enable_ping_based_connection_checking_; bool enable_ping_based_connection_checking_;
// If true, alt-svc headers advertising QUIC in IETF format will be supported.
bool support_ietf_format_quic_altsvc_;
// |connection_at_risk_of_loss_time_| is an optimization to avoid sending // |connection_at_risk_of_loss_time_| is an optimization to avoid sending
// wasteful preface pings (when we just got some data). // wasteful preface pings (when we just got some data).
// //
......
...@@ -50,6 +50,7 @@ SpdySessionPool::SpdySessionPool( ...@@ -50,6 +50,7 @@ SpdySessionPool::SpdySessionPool(
TransportSecurityState* transport_security_state, TransportSecurityState* transport_security_state,
const QuicTransportVersionVector& quic_supported_versions, const QuicTransportVersionVector& quic_supported_versions,
bool enable_ping_based_connection_checking, bool enable_ping_based_connection_checking,
bool support_ietf_format_quic_altsvc,
size_t session_max_recv_window_size, size_t session_max_recv_window_size,
const SettingsMap& initial_settings, const SettingsMap& initial_settings,
SpdySessionPool::TimeFunc time_func, SpdySessionPool::TimeFunc time_func,
...@@ -62,6 +63,7 @@ SpdySessionPool::SpdySessionPool( ...@@ -62,6 +63,7 @@ SpdySessionPool::SpdySessionPool(
enable_sending_initial_data_(true), enable_sending_initial_data_(true),
enable_ping_based_connection_checking_( enable_ping_based_connection_checking_(
enable_ping_based_connection_checking), enable_ping_based_connection_checking),
support_ietf_format_quic_altsvc_(support_ietf_format_quic_altsvc),
session_max_recv_window_size_(session_max_recv_window_size), session_max_recv_window_size_(session_max_recv_window_size),
initial_settings_(initial_settings), initial_settings_(initial_settings),
time_func_(time_func), time_func_(time_func),
...@@ -102,9 +104,9 @@ base::WeakPtr<SpdySession> SpdySessionPool::CreateAvailableSessionFromSocket( ...@@ -102,9 +104,9 @@ base::WeakPtr<SpdySession> SpdySessionPool::CreateAvailableSessionFromSocket(
auto new_session = std::make_unique<SpdySession>( auto new_session = std::make_unique<SpdySession>(
key, http_server_properties_, transport_security_state_, key, http_server_properties_, transport_security_state_,
quic_supported_versions_, enable_sending_initial_data_, quic_supported_versions_, enable_sending_initial_data_,
enable_ping_based_connection_checking_, session_max_recv_window_size_, enable_ping_based_connection_checking_, support_ietf_format_quic_altsvc_,
initial_settings_, time_func_, push_delegate_, proxy_delegate_, session_max_recv_window_size_, initial_settings_, time_func_,
net_log.net_log()); push_delegate_, proxy_delegate_, net_log.net_log());
new_session->InitializeWithSocket(std::move(connection), this); new_session->InitializeWithSocket(std::move(connection), this);
......
...@@ -62,6 +62,7 @@ class NET_EXPORT SpdySessionPool ...@@ -62,6 +62,7 @@ class NET_EXPORT SpdySessionPool
TransportSecurityState* transport_security_state, TransportSecurityState* transport_security_state,
const QuicTransportVersionVector& quic_supported_versions, const QuicTransportVersionVector& quic_supported_versions,
bool enable_ping_based_connection_checking, bool enable_ping_based_connection_checking,
bool support_ietf_format_quic_altsvc,
size_t session_max_recv_window_size, size_t session_max_recv_window_size,
const SettingsMap& initial_settings, const SettingsMap& initial_settings,
SpdySessionPool::TimeFunc time_func, SpdySessionPool::TimeFunc time_func,
...@@ -261,6 +262,9 @@ class NET_EXPORT SpdySessionPool ...@@ -261,6 +262,9 @@ class NET_EXPORT SpdySessionPool
bool enable_sending_initial_data_; bool enable_sending_initial_data_;
bool enable_ping_based_connection_checking_; bool enable_ping_based_connection_checking_;
// If true, alt-svc headers advertising QUIC in IETF format will be supported.
bool support_ietf_format_quic_altsvc_;
size_t session_max_recv_window_size_; size_t session_max_recv_window_size_;
// Settings that are sent in the initial SETTINGS frame // Settings that are sent in the initial SETTINGS frame
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment