




















@@ -0,0 +1,109 @@
1+import fs from "node:fs/promises";
2+import os from "node:os";
3+import path from "node:path";
4+import { Agent, getGlobalDispatcher, setGlobalDispatcher } from "undici";
5+import { afterEach, beforeEach, describe, expect, it } from "vitest";
6+import { clearAllBootstrapSnapshots } from "../agents/bootstrap-cache.js";
7+import { clearConfigCache, clearRuntimeConfigSnapshot } from "../config/config.js";
8+import { clearSessionStoreCacheForTest } from "../config/sessions/store.js";
9+import { resetAgentRunContextForTest } from "../infra/agent-events.js";
10+import { PROXY_ENV_KEYS } from "../infra/net/proxy-env.js";
11+import { clearGatewaySubagentRuntime } from "../plugins/runtime/index.js";
12+import { captureEnv } from "../test-utils/env.js";
13+import { startGatewayServer } from "./server.js";
14+import { getFreeGatewayPort } from "./test-helpers.e2e.js";
15+16+const NETWORK_GATEWAY_ENV_KEYS = [
17+"HOME",
18+"OPENCLAW_STATE_DIR",
19+"OPENCLAW_CONFIG_PATH",
20+"OPENCLAW_GATEWAY_TOKEN",
21+"OPENCLAW_SKIP_CHANNELS",
22+"OPENCLAW_SKIP_GMAIL_WATCHER",
23+"OPENCLAW_SKIP_CRON",
24+"OPENCLAW_SKIP_CANVAS_HOST",
25+"OPENCLAW_SKIP_BROWSER_CONTROL_SERVER",
26+"OPENCLAW_SKIP_PROVIDERS",
27+"OPENCLAW_BUNDLED_PLUGINS_DIR",
28+"OPENCLAW_TEST_MINIMAL_GATEWAY",
29+ ...PROXY_ENV_KEYS,
30+"NO_PROXY",
31+"no_proxy",
32+] as const;
33+34+function isEnvHttpProxyDispatcher(dispatcher: unknown): boolean {
35+return (
36+(dispatcher as { constructor?: { name?: string } } | undefined)?.constructor?.name ===
37+"EnvHttpProxyAgent"
38+);
39+}
40+41+describe("gateway network runtime", () => {
42+beforeEach(() => {
43+clearRuntimeConfigSnapshot();
44+clearConfigCache();
45+clearSessionStoreCacheForTest();
46+resetAgentRunContextForTest();
47+clearAllBootstrapSnapshots();
48+clearGatewaySubagentRuntime();
49+});
50+51+afterEach(() => {
52+clearRuntimeConfigSnapshot();
53+clearConfigCache();
54+clearSessionStoreCacheForTest();
55+resetAgentRunContextForTest();
56+clearAllBootstrapSnapshots();
57+clearGatewaySubagentRuntime();
58+});
59+60+it("bootstraps env proxy dispatching when the gateway starts directly", async () => {
61+const envSnapshot = captureEnv([...NETWORK_GATEWAY_ENV_KEYS]);
62+const originalDispatcher = getGlobalDispatcher();
63+const tempHome = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-gw-proxy-home-"));
64+let server: Awaited<ReturnType<typeof startGatewayServer>> | undefined;
65+66+try {
67+setGlobalDispatcher(new Agent());
68+for (const key of NETWORK_GATEWAY_ENV_KEYS) {
69+delete process.env[key];
70+}
71+process.env.HTTPS_PROXY = "http://127.0.0.1:9";
72+73+process.env.HOME = tempHome;
74+process.env.OPENCLAW_STATE_DIR = path.join(tempHome, ".openclaw");
75+process.env.OPENCLAW_SKIP_CHANNELS = "1";
76+process.env.OPENCLAW_SKIP_GMAIL_WATCHER = "1";
77+process.env.OPENCLAW_SKIP_CRON = "1";
78+process.env.OPENCLAW_SKIP_CANVAS_HOST = "1";
79+process.env.OPENCLAW_SKIP_BROWSER_CONTROL_SERVER = "1";
80+process.env.OPENCLAW_SKIP_PROVIDERS = "1";
81+process.env.OPENCLAW_TEST_MINIMAL_GATEWAY = "1";
82+process.env.OPENCLAW_BUNDLED_PLUGINS_DIR = path.join(tempHome, "empty-bundled-plugins");
83+await fs.mkdir(process.env.OPENCLAW_BUNDLED_PLUGINS_DIR, { recursive: true });
84+85+const token = `proxy-token-${process.pid}-${process.env.VITEST_POOL_ID ?? "0"}`;
86+process.env.OPENCLAW_GATEWAY_TOKEN = token;
87+const configPath = path.join(tempHome, ".openclaw", "openclaw.json");
88+await fs.mkdir(path.dirname(configPath), { recursive: true });
89+await fs.writeFile(
90+configPath,
91+`${JSON.stringify({ gateway: { auth: { mode: "token", token } } }, null, 2)}\n`,
92+);
93+process.env.OPENCLAW_CONFIG_PATH = configPath;
94+95+server = await startGatewayServer(await getFreeGatewayPort(), {
96+bind: "loopback",
97+auth: { mode: "token", token },
98+controlUiEnabled: false,
99+});
100+101+expect(isEnvHttpProxyDispatcher(getGlobalDispatcher())).toBe(true);
102+} finally {
103+await server?.close({ reason: "gateway proxy bootstrap test complete" });
104+setGlobalDispatcher(originalDispatcher);
105+await fs.rm(tempHome, { recursive: true, force: true });
106+envSnapshot.restore();
107+}
108+});
109+});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。