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