Commit a58c1b66 authored by Victor Vasiliev's avatar Victor Vasiliev Committed by Commit Bot

Always enable QUIC draft27 when speaking QuicTransport

QuicTransport requires TLS 1.3 and message frames, but the version of
QUIC we currently use by default does not support that.  Making the
version used by QuicTransport depend randomly on current experiment
config seems to be counterproductive for the purposes of origin trial,
so let's pick draft27 and use that for the duration of the trial.

Bug: 1084289

Change-Id: I7deb72e742692cf08c8922756109b48ce64ec9fa
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2208090
Commit-Queue: Victor Vasiliev <vasilvv@chromium.org>
Reviewed-by: default avatarZhongyi Shi <zhongyi@chromium.org>
Reviewed-by: default avatarDavid Schinazi <dschinazi@chromium.org>
Cr-Commit-Position: refs/heads/master@{#770052}
parent 3b636e32
......@@ -26,6 +26,9 @@ std::set<std::string> HostsFromOrigins(std::set<HostPortPair> origins) {
}
} // namespace
constexpr quic::ParsedQuicVersion
QuicTransportClient::kQuicVersionForOriginTrial;
QuicTransportClient::QuicTransportClient(
const GURL& url,
const url::Origin& origin,
......@@ -134,13 +137,16 @@ int QuicTransportClient::DoInit() {
// TODO(vasilvv): check if QUIC is disabled by policy.
// Ensure that for the duration of the origin trial, a fixed QUIC transport
// version is available.
supported_versions_.push_back(kQuicVersionForOriginTrial);
// Add other supported versions if available.
for (quic::ParsedQuicVersion& version :
quic_context_->params()->supported_versions) {
// QuicTransport requires TLS-style ALPN.
if (version.handshake_protocol != quic::PROTOCOL_TLS1_3)
continue;
if (!quic::VersionSupportsMessageFrames(version.transport_version))
if (!quic::IsVersionValidForQuicTransport(version))
continue;
if (version == kQuicVersionForOriginTrial)
continue; // Skip as we've already added it above.
supported_versions_.push_back(version);
}
if (supported_versions_.empty()) {
......
......@@ -17,6 +17,7 @@
#include "net/socket/client_socket_factory.h"
#include "net/third_party/quiche/src/quic/core/crypto/quic_crypto_client_config.h"
#include "net/third_party/quiche/src/quic/core/quic_config.h"
#include "net/third_party/quiche/src/quic/core/quic_versions.h"
#include "net/third_party/quiche/src/quic/quic_transport/quic_transport_client_session.h"
#include "url/gurl.h"
#include "url/origin.h"
......@@ -74,6 +75,11 @@ class NET_EXPORT QuicTransportClient
virtual void OnCanCreateNewOutgoingUnidirectionalStream() = 0;
};
// QUIC protocol version that is used in the origin trial.
static constexpr quic::ParsedQuicVersion kQuicVersionForOriginTrial =
quic::ParsedQuicVersion(quic::PROTOCOL_TLS1_3,
quic::QUIC_VERSION_IETF_DRAFT_27);
// |visitor| and |context| must outlive this object.
QuicTransportClient(const GURL& url,
const url::Origin& origin,
......
......@@ -40,7 +40,7 @@ class MockVisitor : public QuicTransportClient::Visitor {
class QuicTransportEndToEndTest : public TestWithTaskEnvironment {
public:
QuicTransportEndToEndTest() {
quic::QuicEnableVersion(quic::DefaultVersionForQuicTransport());
quic::QuicEnableVersion(QuicTransportClient::kQuicVersionForOriginTrial);
origin_ = url::Origin::Create(GURL{"https://example.org"});
isolation_key_ = NetworkIsolationKey(origin_, origin_);
......@@ -57,8 +57,7 @@ class QuicTransportEndToEndTest : public TestWithTaskEnvironment {
builder.set_host_resolver(std::move(host_resolver));
auto quic_context = std::make_unique<QuicContext>();
quic_context->params()->supported_versions.push_back(
quic::DefaultVersionForQuicTransport());
quic_context->params()->supported_versions.clear();
// This is required to bypass the check that only allows known certificate
// roots in QUIC.
quic_context->params()->origins_to_force_quic_on.insert(
......
......@@ -33,6 +33,17 @@ constexpr size_t kMaxReadsPerEvent = 32;
constexpr size_t kMaxNewConnectionsPerEvent = 32;
constexpr int kReadBufferSize = 2 * quic::kMaxIncomingPacketSize;
// TODO(vasilvv): move this into the shared code.
quic::ParsedQuicVersionVector AllVersionsValidForQuicTransport() {
quic::ParsedQuicVersionVector result;
for (quic::ParsedQuicVersion version : quic::AllSupportedVersions()) {
if (!quic::IsVersionValidForQuicTransport(version))
continue;
result.push_back(version);
}
return result;
}
} // namespace
class QuicTransportSimpleServerSessionHelper
......@@ -52,7 +63,7 @@ QuicTransportSimpleServer::QuicTransportSimpleServer(
std::vector<url::Origin> accepted_origins,
std::unique_ptr<quic::ProofSource> proof_source)
: port_(port),
version_manager_({quic::DefaultVersionForQuicTransport()}),
version_manager_(AllVersionsValidForQuicTransport()),
clock_(QuicChromiumClock::GetInstance()),
crypto_config_(kSourceAddressTokenSecret,
quic::QuicRandom::GetInstance(),
......
......@@ -4,5 +4,5 @@ Instantiate QuicTransport.
Log.onEntryAdded
source: network
level: error
text: Failed to establish a connection to quic-transport://localhost/: net::ERR_NOT_IMPLEMENTED.
text: Failed to establish a connection to quic-transport://localhost/: [net error].
......@@ -8,10 +8,12 @@
dp.Log.onEntryAdded(event => {
const entry = event.params.entry;
// Remove the error code, as it is platform-specific and can change.
const text = entry.text.replace(/net::ERR_[A-Z_]+/, '[net error]');
testRunner.log('Log.onEntryAdded');
testRunner.log(`source: ${entry.source}`);
testRunner.log(`level: ${entry.level}`);
testRunner.log(`text: ${entry.text}`);
testRunner.log(`text: ${text}`);
testRunner.completeTest();
});
......
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