openclaw/src/infra/net/proxy-env.ts
Tak Hoffman 87876a3e36
Fix env proxy bootstrap for model traffic (#43248)
* Fix env proxy bootstrap for model traffic

* Address proxy dispatcher review followups

* Fix proxy env precedence for empty lowercase vars
2026-03-11 10:21:35 -05:00

56 lines
1.7 KiB
TypeScript

export const PROXY_ENV_KEYS = [
"HTTP_PROXY",
"HTTPS_PROXY",
"ALL_PROXY",
"http_proxy",
"https_proxy",
"all_proxy",
] as const;
export function hasProxyEnvConfigured(env: NodeJS.ProcessEnv = process.env): boolean {
for (const key of PROXY_ENV_KEYS) {
const value = env[key];
if (typeof value === "string" && value.trim().length > 0) {
return true;
}
}
return false;
}
function normalizeProxyEnvValue(value: string | undefined): string | null | undefined {
if (typeof value !== "string") {
return undefined;
}
const trimmed = value.trim();
return trimmed.length > 0 ? trimmed : null;
}
/**
* Match undici EnvHttpProxyAgent semantics for env-based HTTP/S proxy selection:
* - lower-case vars take precedence over upper-case
* - HTTPS requests prefer https_proxy/HTTPS_PROXY, then fall back to http_proxy/HTTP_PROXY
* - ALL_PROXY is ignored by EnvHttpProxyAgent
*/
export function resolveEnvHttpProxyUrl(
protocol: "http" | "https",
env: NodeJS.ProcessEnv = process.env,
): string | undefined {
const lowerHttpProxy = normalizeProxyEnvValue(env.http_proxy);
const lowerHttpsProxy = normalizeProxyEnvValue(env.https_proxy);
const httpProxy =
lowerHttpProxy !== undefined ? lowerHttpProxy : normalizeProxyEnvValue(env.HTTP_PROXY);
const httpsProxy =
lowerHttpsProxy !== undefined ? lowerHttpsProxy : normalizeProxyEnvValue(env.HTTPS_PROXY);
if (protocol === "https") {
return httpsProxy ?? httpProxy ?? undefined;
}
return httpProxy ?? undefined;
}
export function hasEnvHttpProxyConfigured(
protocol: "http" | "https" = "https",
env: NodeJS.ProcessEnv = process.env,
): boolean {
return resolveEnvHttpProxyUrl(protocol, env) !== undefined;
}