aboutsummaryrefslogtreecommitdiff
path: root/src/zen/zen.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/zen/zen.cpp')
-rw-r--r--src/zen/zen.cpp48
1 files changed, 46 insertions, 2 deletions
diff --git a/src/zen/zen.cpp b/src/zen/zen.cpp
index 7b1b6e7d7..86154c291 100644
--- a/src/zen/zen.cpp
+++ b/src/zen/zen.cpp
@@ -369,9 +369,31 @@ GetReturnCodeFromHttpResult(const HttpClientError& Ex)
}
}
+bool
+ZenCmdBase::IsUnixSocketSpec(std::string_view Spec)
+{
+ return Spec.starts_with("unix://");
+}
+
+HttpClient
+ZenCmdBase::CreateHttpClient(const std::string& HostSpec, HttpClientSettings Settings)
+{
+ if (IsUnixSocketSpec(HostSpec))
+ {
+ Settings.UnixSocketPath = HostSpec.substr(7); // strip "unix://"
+ return HttpClient("http://localhost", Settings);
+ }
+ return HttpClient(HostSpec, Settings);
+}
+
std::string
ZenCmdBase::ResolveTargetHostSpec(const std::string& InHostSpec, uint16_t& OutEffectivePort)
{
+ if (IsUnixSocketSpec(InHostSpec))
+ {
+ return InHostSpec; // pass through as-is; parsed later in CreateHttpClient
+ }
+
if (InHostSpec.empty())
{
// If no host is specified then look to see if we have an instance
@@ -386,8 +408,30 @@ ZenCmdBase::ResolveTargetHostSpec(const std::string& InHostSpec, uint16_t& OutEf
Servers.Snapshot([&](const zen::ZenServerState::ZenServerEntry& Entry) {
if (ResolvedSpec.empty())
{
- ResolvedSpec = fmt::format("http://localhost:{}", Entry.EffectiveListenPort.load());
OutEffectivePort = Entry.EffectiveListenPort;
+
+ // Check for per-instance info (e.g. UDS path)
+ if (Entry.HasInstanceInfo())
+ {
+ ZenServerInstanceInfo Info;
+ if (Info.OpenReadOnly(Entry.GetSessionId()))
+ {
+ InstanceInfoData Data = Info.Read();
+ if (!Data.UnixSocketPath.empty())
+ {
+ ResolvedSpec = "unix://" + PathToUtf8(Data.UnixSocketPath);
+ return;
+ }
+ }
+ }
+
+ // Skip servers with --no-network since TCP is not reachable
+ if (Entry.IsNoNetwork())
+ {
+ return;
+ }
+
+ ResolvedSpec = fmt::format("http://localhost:{}", Entry.EffectiveListenPort.load());
}
});
@@ -685,7 +729,7 @@ main(int argc, char** argv)
Options.add_options()("c, command", "Sub command", cxxopts::value<std::string>(SubCommand));
Options.add_options()("httpclient",
"Select HTTP client implementation (e.g. 'curl', 'cpr')",
- cxxopts::value<std::string>(GlobalOptions.HttpClientBackend)->default_value("cpr"));
+ cxxopts::value<std::string>(GlobalOptions.HttpClientBackend)->default_value("curl"));
int CoreLimit = 0;