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;
}