Allow masque_client to select IP address family for DNS PiperOrigin-RevId: 486345506
diff --git a/quiche/quic/masque/masque_client_bin.cc b/quiche/quic/masque/masque_client_bin.cc index 58c388b..b0ec7c0 100644 --- a/quiche/quic/masque/masque_client_bin.cc +++ b/quiche/quic/masque/masque_client_bin.cc
@@ -32,6 +32,10 @@ bool, disable_certificate_verification, false, "If true, don't verify the server certificate."); +DEFINE_QUICHE_COMMAND_LINE_FLAG(int, address_family, 0, + "IP address family to use. Must be 0, 4 or 6. " + "Defaults to 0 which means any."); + DEFINE_QUICHE_COMMAND_LINE_FLAG( std::string, masque_mode, "", "Allows setting MASQUE mode, currently only valid value is \"open\"."); @@ -99,6 +103,19 @@ return 1; } } + const int address_family = + quiche::GetQuicheCommandLineFlag(FLAGS_address_family); + int address_family_for_lookup; + if (address_family == 0) { + address_family_for_lookup = AF_UNSPEC; + } else if (address_family == 4) { + address_family_for_lookup = AF_INET; + } else if (address_family == 6) { + address_family_for_lookup = AF_INET6; + } else { + std::cerr << "Invalid address_family " << address_family << std::endl; + return 1; + } std::unique_ptr<MasqueClient> masque_client = MasqueClient::Create( uri_template, masque_mode, event_loop.get(), std::move(proof_verifier)); if (masque_client == nullptr) { @@ -111,7 +128,7 @@ for (size_t i = 1; i < urls.size(); ++i) { if (!tools::SendEncapsulatedMasqueRequest( masque_client.get(), event_loop.get(), urls[i], - disable_certificate_verification)) { + disable_certificate_verification, address_family_for_lookup)) { return 1; } }
diff --git a/quiche/quic/masque/masque_client_tools.cc b/quiche/quic/masque/masque_client_tools.cc index 06ca3ef..e7405ec 100644 --- a/quiche/quic/masque/masque_client_tools.cc +++ b/quiche/quic/masque/masque_client_tools.cc
@@ -18,7 +18,8 @@ bool SendEncapsulatedMasqueRequest(MasqueClient* masque_client, QuicEventLoop* event_loop, std::string url_string, - bool disable_certificate_verification) { + bool disable_certificate_verification, + int address_family_for_lookup) { const QuicUrl url(url_string, "https"); std::unique_ptr<ProofVerifier> proof_verifier; if (disable_certificate_verification) { @@ -28,8 +29,8 @@ } // Build the client, and try to connect. - const QuicSocketAddress addr = - LookupAddress(url.host(), absl::StrCat(url.port())); + const QuicSocketAddress addr = LookupAddress( + address_family_for_lookup, url.host(), absl::StrCat(url.port())); if (!addr.IsInitialized()) { QUIC_LOG(ERROR) << "Unable to resolve address: " << url.host(); return false;
diff --git a/quiche/quic/masque/masque_client_tools.h b/quiche/quic/masque/masque_client_tools.h index 307a09f..bb30a14 100644 --- a/quiche/quic/masque/masque_client_tools.h +++ b/quiche/quic/masque/masque_client_tools.h
@@ -17,7 +17,8 @@ bool SendEncapsulatedMasqueRequest(MasqueClient* masque_client, QuicEventLoop* event_loop, std::string url_string, - bool disable_certificate_verification); + bool disable_certificate_verification, + int address_family_for_lookup); } // namespace tools } // namespace quic