






















@@ -123,6 +123,7 @@ beforeEach(() => {
123123"https_proxy",
124124"NO_PROXY",
125125"no_proxy",
126+"OPENCLAW_PROXY_URL",
126127]) {
127128vi.stubEnv(key, "");
128129}
@@ -386,6 +387,11 @@ describe("resolveTelegramFetch", () => {
386387await resolved("https://api.telegram.org/botx/getMe");
387388388389expect(EnvHttpProxyAgentCtor).toHaveBeenCalledTimes(1);
390+expect(EnvHttpProxyAgentCtor).toHaveBeenCalledWith(
391+expect.objectContaining({
392+httpsProxy: "http://127.0.0.1:7890",
393+}),
394+);
389395expect(AgentCtor).not.toHaveBeenCalled();
390396391397const dispatcher = getDispatcherFromUndiciCall(1);
@@ -421,6 +427,80 @@ describe("resolveTelegramFetch", () => {
421427);
422428});
423429430+it("uses OPENCLAW_PROXY_URL as a Telegram explicit proxy when proxy env is absent", async () => {
431+vi.stubEnv("OPENCLAW_PROXY_URL", "http://127.0.0.1:7788");
432+undiciFetch.mockResolvedValue({ ok: true } as Response);
433+434+const transport = resolveTelegramTransport(undefined, {
435+network: {
436+autoSelectFamily: false,
437+dnsResultOrder: "ipv4first",
438+},
439+});
440+441+await transport.fetch("https://api.telegram.org/botTOKEN/getMe");
442+443+expect(ProxyAgentCtor).toHaveBeenCalledTimes(1);
444+expect(ProxyAgentCtor).toHaveBeenCalledWith(
445+expect.objectContaining({
446+allowH2: false,
447+uri: "http://127.0.0.1:7788",
448+requestTls: expect.objectContaining({
449+autoSelectFamily: false,
450+}),
451+}),
452+);
453+expect(EnvHttpProxyAgentCtor).not.toHaveBeenCalled();
454+expect(AgentCtor).not.toHaveBeenCalled();
455+expect(transport.dispatcherAttempts?.[0]?.dispatcherPolicy).toEqual(
456+expect.objectContaining({
457+mode: "explicit-proxy",
458+proxyUrl: "http://127.0.0.1:7788",
459+}),
460+);
461+});
462+463+it("preserves caller-provided custom fetch when OPENCLAW_PROXY_URL is present", async () => {
464+vi.stubEnv("OPENCLAW_PROXY_URL", "http://127.0.0.1:7788");
465+const proxyFetch = vi.fn(async () => ({ ok: true }) as Response) as unknown as typeof fetch;
466+467+const transport = resolveTelegramTransport(proxyFetch, {
468+network: {
469+autoSelectFamily: false,
470+dnsResultOrder: "ipv4first",
471+},
472+});
473+474+await transport.fetch("https://api.telegram.org/botTOKEN/getMe");
475+476+expect(proxyFetch).toHaveBeenCalledTimes(1);
477+expect(undiciFetch).not.toHaveBeenCalled();
478+expect(ProxyAgentCtor).not.toHaveBeenCalled();
479+expect(EnvHttpProxyAgentCtor).not.toHaveBeenCalled();
480+expect(AgentCtor).not.toHaveBeenCalled();
481+expect(transport.sourceFetch).not.toBe(undiciFetch);
482+expect(transport.dispatcherAttempts).toBeUndefined();
483+});
484+485+it("prefers standard proxy env over OPENCLAW_PROXY_URL for Telegram", async () => {
486+vi.stubEnv("OPENCLAW_PROXY_URL", "http://127.0.0.1:7788");
487+vi.stubEnv("https_proxy", "http://127.0.0.1:7890");
488+undiciFetch.mockResolvedValue({ ok: true } as Response);
489+490+const resolved = resolveTelegramFetchOrThrow(undefined, {
491+network: {
492+autoSelectFamily: false,
493+dnsResultOrder: "ipv4first",
494+},
495+});
496+497+await resolved("https://api.telegram.org/botx/getMe");
498+499+expect(EnvHttpProxyAgentCtor).toHaveBeenCalledTimes(1);
500+expect(ProxyAgentCtor).not.toHaveBeenCalled();
501+expect(AgentCtor).not.toHaveBeenCalled();
502+});
503+424504it("pins env-proxy transport policy onto proxyTls for proxied HTTPS requests", async () => {
425505vi.stubEnv("https_proxy", "http://127.0.0.1:7890");
426506undiciFetch.mockResolvedValue({ ok: true } as Response);
@@ -572,12 +652,10 @@ describe("resolveTelegramFetch", () => {
572652});
573653});
574654575-it("treats ALL_PROXY-only env as direct transport and arms sticky IPv4 fallback", async () => {
576-vi.stubEnv("ALL_PROXY", "socks5://127.0.0.1:1080");
577-undiciFetch
578-.mockRejectedValueOnce(buildFetchFallbackError("EHOSTUNREACH"))
579-.mockResolvedValueOnce({ ok: true } as Response)
580-.mockResolvedValueOnce({ ok: true } as Response);
655+it("uses ALL_PROXY env as EnvHttpProxyAgent transport", async () => {
656+vi.stubEnv("ALL_PROXY", "http://127.0.0.1:7891");
657+vi.stubEnv("all_proxy", "http://127.0.0.1:7891");
658+undiciFetch.mockResolvedValue({ ok: true } as Response);
581659582660const transport = resolveTelegramTransport(undefined, {
583661network: {
@@ -588,19 +666,20 @@ describe("resolveTelegramFetch", () => {
588666const resolved = transport.fetch;
589667590668await resolved("https://api.telegram.org/botx/sendMessage");
591-await resolved("https://api.telegram.org/botx/sendChatAction");
592669593-expect(EnvHttpProxyAgentCtor).not.toHaveBeenCalled();
594-expect(AgentCtor).toHaveBeenCalledTimes(2);
670+expect(EnvHttpProxyAgentCtor).toHaveBeenCalledTimes(1);
671+expect(EnvHttpProxyAgentCtor).toHaveBeenCalledWith(
672+expect.objectContaining({
673+allowH2: false,
674+httpProxy: "http://127.0.0.1:7891",
675+httpsProxy: "http://127.0.0.1:7891",
676+}),
677+);
678+expect(AgentCtor).not.toHaveBeenCalled();
595679596-expectPinnedIpv4ConnectDispatcher({
597-firstCall: 1,
598-pinnedCall: 2,
599-followupCall: 3,
600-});
601680expect(transport.dispatcherAttempts?.[0]?.dispatcherPolicy).toEqual(
602681expect.objectContaining({
603-mode: "direct",
682+mode: "env-proxy",
604683}),
605684);
606685});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。