diff --git a/src/browser/cdp-proxy-bypass.test.ts b/src/browser/cdp-proxy-bypass.test.ts index 578f0f39630..a38298f0c62 100644 --- a/src/browser/cdp-proxy-bypass.test.ts +++ b/src/browser/cdp-proxy-bypass.test.ts @@ -248,3 +248,30 @@ describe("withNoProxyForLocalhost reverse exit order", () => { } }); }); + +describe("withNoProxyForLocalhost preserves user-configured NO_PROXY", () => { + it("does not delete NO_PROXY when loopback entries already present", async () => { + const userNoProxy = "localhost,127.0.0.1,[::1],myhost.internal"; + process.env.NO_PROXY = userNoProxy; + process.env.no_proxy = userNoProxy; + process.env.HTTP_PROXY = "http://proxy:8080"; + + try { + const { withNoProxyForLocalhost } = await import("./cdp-proxy-bypass.js"); + + await withNoProxyForLocalhost(async () => { + // Should not modify since loopback is already covered + expect(process.env.NO_PROXY).toBe(userNoProxy); + return "ok"; + }); + + // After call completes, user's NO_PROXY must still be intact + expect(process.env.NO_PROXY).toBe(userNoProxy); + expect(process.env.no_proxy).toBe(userNoProxy); + } finally { + delete process.env.HTTP_PROXY; + delete process.env.NO_PROXY; + delete process.env.no_proxy; + } + }); +}); diff --git a/src/browser/cdp-proxy-bypass.ts b/src/browser/cdp-proxy-bypass.ts index c41ac2becdc..270a2d69a4a 100644 --- a/src/browser/cdp-proxy-bypass.ts +++ b/src/browser/cdp-proxy-bypass.ts @@ -63,6 +63,7 @@ let savedNoProxy: string | undefined; let savedNoProxyLower: string | undefined; const LOOPBACK_ENTRIES = "localhost,127.0.0.1,[::1]"; +let noProxyDidModify = false; function noProxyAlreadyCoversLocalhost(): boolean { const current = process.env.NO_PROXY || process.env.no_proxy || ""; @@ -86,13 +87,14 @@ export async function withNoProxyForLocalhost(fn: () => Promise): Promise< const extended = current ? `${current},${LOOPBACK_ENTRIES}` : LOOPBACK_ENTRIES; process.env.NO_PROXY = extended; process.env.no_proxy = extended; + noProxyDidModify = true; } try { return await fn(); } finally { noProxyRefCount--; - if (noProxyRefCount === 0) { + if (noProxyRefCount === 0 && noProxyDidModify) { if (savedNoProxy !== undefined) { process.env.NO_PROXY = savedNoProxy; } else { @@ -105,6 +107,7 @@ export async function withNoProxyForLocalhost(fn: () => Promise): Promise< } savedNoProxy = undefined; savedNoProxyLower = undefined; + noProxyDidModify = false; } } }