Re-implement QUIC toy server CONNECT flags

Was previously rolled back in cl/468306591 due to issues with ConnectServerBackend adding dependencies on POSIX-only code via the LookupAddress() calls for host resolution, and those added dependencies interacting poorly with Chrome's partial dependency on QuicToyServer.  Those issues should be fixed by cl/468763588 and cl/480145712.

PiperOrigin-RevId: 481204878
diff --git a/quiche/quic/tools/quic_toy_server.cc b/quiche/quic/tools/quic_toy_server.cc
index 6b3c76f..132ecce 100644
--- a/quiche/quic/tools/quic_toy_server.cc
+++ b/quiche/quic/tools/quic_toy_server.cc
@@ -7,11 +7,17 @@
 #include <utility>
 #include <vector>
 
+#include "absl/container/flat_hash_set.h"
+#include "absl/strings/str_split.h"
+#include "absl/strings/string_view.h"
+#include "quiche/quic/core/quic_server_id.h"
 #include "quiche/quic/core/quic_versions.h"
 #include "quiche/quic/platform/api/quic_default_proof_providers.h"
 #include "quiche/quic/platform/api/quic_socket_address.h"
+#include "quiche/quic/tools/connect_server_backend.h"
 #include "quiche/quic/tools/quic_memory_cache_backend.h"
 #include "quiche/common/platform/api/quiche_command_line_flags.h"
+#include "quiche/common/platform/api/quiche_logging.h"
 
 DEFINE_QUICHE_COMMAND_LINE_FLAG(int32_t, port, 6121,
                                 "The port the quic server will listen on.");
@@ -39,6 +45,11 @@
 DEFINE_QUICHE_COMMAND_LINE_FLAG(bool, enable_webtransport, false,
                                 "If true, WebTransport support is enabled.");
 
+DEFINE_QUICHE_COMMAND_LINE_FLAG(
+    std::string, connect_proxy_destinations, "",
+    "Specifies a comma-separated list of destinations (\"hostname:port\") to "
+    "which the quic server will allow tunneling via CONNECT.");
+
 namespace quic {
 
 std::unique_ptr<quic::QuicSimpleServerBackend>
@@ -55,6 +66,25 @@
   if (quiche::GetQuicheCommandLineFlag(FLAGS_enable_webtransport)) {
     memory_cache_backend->EnableWebTransport();
   }
+
+  if (!quiche::GetQuicheCommandLineFlag(FLAGS_connect_proxy_destinations)
+           .empty()) {
+    absl::flat_hash_set<QuicServerId> connect_proxy_destinations;
+    for (absl::string_view destination : absl::StrSplit(
+             quiche::GetQuicheCommandLineFlag(FLAGS_connect_proxy_destinations),
+             ',', absl::SkipEmpty())) {
+      absl::optional<QuicServerId> destination_server_id =
+          QuicServerId::ParseFromHostPortString(destination);
+      QUICHE_CHECK(destination_server_id.has_value());
+      connect_proxy_destinations.insert(
+          std::move(destination_server_id).value());
+    }
+    QUICHE_CHECK(!connect_proxy_destinations.empty());
+
+    return std::make_unique<ConnectServerBackend>(
+        std::move(memory_cache_backend), std::move(connect_proxy_destinations));
+  }
+
   return memory_cache_backend;
 }