Allow more URLs in masque_client
Before this change, passing in the URL "127.0.0.1:10002" would fail to parse, and the code would incorrectly send an empty hostname on the wire. This change adds a second parsing step that handles such failures, and adds some checks to detect empty hostnames earlier.
PiperOrigin-RevId: 698411730
diff --git a/quiche/quic/masque/masque_client.cc b/quiche/quic/masque/masque_client.cc
index 874c20f..da6611e 100644
--- a/quiche/quic/masque/masque_client.cc
+++ b/quiche/quic/masque/masque_client.cc
@@ -26,6 +26,7 @@
#include "quiche/quic/tools/quic_default_client.h"
#include "quiche/quic/tools/quic_name_lookup.h"
#include "quiche/quic/tools/quic_url.h"
+#include "quiche/common/platform/api/quiche_logging.h"
namespace quic {
@@ -37,7 +38,9 @@
: QuicDefaultClient(server_address, server_id, MasqueSupportedVersions(),
event_loop, std::move(proof_verifier)),
masque_mode_(masque_mode),
- uri_template_(uri_template) {}
+ uri_template_(uri_template) {
+ QUICHE_CHECK(!QuicUrl(uri_template_).host().empty());
+}
MasqueClient::MasqueClient(
QuicSocketAddress server_address, const QuicServerId& server_id,
@@ -49,7 +52,9 @@
config, event_loop, std::move(network_helper),
std::move(proof_verifier)),
masque_mode_(masque_mode),
- uri_template_(uri_template) {}
+ uri_template_(uri_template) {
+ QUICHE_CHECK(!QuicUrl(uri_template_).host().empty());
+}
MasqueClient::MasqueClient(
QuicSocketAddress server_address, const QuicServerId& server_id,
@@ -89,6 +94,11 @@
QuicEventLoop* event_loop, std::unique_ptr<ProofVerifier> proof_verifier) {
QuicUrl url(uri_template);
std::string host = url.host();
+ if (host.empty()) {
+ QUIC_LOG(ERROR) << "Failed to parse URI template \"" << uri_template
+ << "\"";
+ return nullptr;
+ }
uint16_t port = url.port();
// Build the masque_client, and try to connect.
QuicSocketAddress addr = tools::LookupAddress(host, absl::StrCat(port));
diff --git a/quiche/quic/masque/masque_client_session.cc b/quiche/quic/masque/masque_client_session.cc
index 4ecf75d..b9efaf9 100644
--- a/quiche/quic/masque/masque_client_session.cc
+++ b/quiche/quic/masque/masque_client_session.cc
@@ -69,6 +69,7 @@
masque_mode_(masque_mode),
uri_template_(uri_template),
owner_(owner) {
+ QUICHE_CHECK(!QuicUrl(uri_template_).host().empty());
// We don't currently use `masque_mode_` but will in the future. To silence
// clang's `-Wunused-private-field` warning for this when building QUICHE for
// Chrome, add a use of it here.
@@ -112,6 +113,7 @@
} else {
target_host = target_server_address.host().ToString();
}
+ QUICHE_CHECK(!target_host.empty());
url::Parsed parsed_uri_template;
url::ParseStandardURL(uri_template_.c_str(), uri_template_.length(),
@@ -704,6 +706,7 @@
quiche::QuicheIpAddress MasqueClientSession::GetFakeAddress(
absl::string_view hostname) {
+ QUICHE_CHECK(!hostname.empty());
quiche::QuicheIpAddress address;
uint8_t address_bytes[16] = {0xFD};
quiche::QuicheRandom::GetInstance()->RandBytes(&address_bytes[1],
diff --git a/quiche/quic/masque/masque_client_tools.cc b/quiche/quic/masque/masque_client_tools.cc
index 1e71ada..74ec2ed 100644
--- a/quiche/quic/masque/masque_client_tools.cc
+++ b/quiche/quic/masque/masque_client_tools.cc
@@ -10,6 +10,7 @@
#include <string>
#include <utility>
+#include "absl/strings/match.h"
#include "absl/strings/str_cat.h"
#include "quiche/quic/core/crypto/proof_verifier.h"
#include "quiche/quic/core/io/quic_event_loop.h"
@@ -68,7 +69,16 @@
QUIC_LOG(ERROR) << "Refusing to use MASQUE without datagram support";
return nullptr;
}
- const QuicUrl url(url_string, "https");
+
+ QuicUrl url(url_string, "https");
+ if (url.host().empty() && !absl::StrContains(url_string, "://")) {
+ url = QuicUrl(absl::StrCat("https://", url_string));
+ }
+ if (url.host().empty()) {
+ QUIC_LOG(ERROR) << "Failed to parse URL \"" << url_string << "\"";
+ return nullptr;
+ }
+
std::unique_ptr<ProofVerifier> proof_verifier;
if (disable_certificate_verification) {
proof_verifier = std::make_unique<FakeProofVerifier>();