mirror of
https://github.com/tiennm99/ccs.git
synced 2026-10-14 06:17:27 +00:00
fix: align proxy routing across fetch and downloader
This commit is contained in:
1 parent
f50c9625de
commit
fd5d16f3f3
5 files changed
+236
-21
No files matched your search
@@ -0,0 +1,96 @@
|
||||
import { afterEach, beforeEach, describe, expect, it } from 'bun:test';
|
||||
import { getProxyResolution, shouldBypassProxy } from '../../../src/utils/proxy-env';
|
||||
|
||||
const PROXY_ENV_KEYS = [
|
||||
'http_proxy',
|
||||
'HTTP_PROXY',
|
||||
'https_proxy',
|
||||
'HTTPS_PROXY',
|
||||
'all_proxy',
|
||||
'ALL_PROXY',
|
||||
'no_proxy',
|
||||
'NO_PROXY',
|
||||
] as const;
|
||||
|
||||
describe('proxy env helpers', () => {
|
||||
const originalEnv = new Map<string, string | undefined>();
|
||||
|
||||
beforeEach(() => {
|
||||
for (const key of PROXY_ENV_KEYS) {
|
||||
originalEnv.set(key, process.env[key]);
|
||||
delete process.env[key];
|
||||
}
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
for (const key of PROXY_ENV_KEYS) {
|
||||
const value = originalEnv.get(key);
|
||||
if (value === undefined) {
|
||||
delete process.env[key];
|
||||
} else {
|
||||
process.env[key] = value;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
describe('getProxyResolution', () => {
|
||||
it('falls back from invalid HTTPS_PROXY to valid HTTP_PROXY for HTTPS requests', () => {
|
||||
process.env.HTTPS_PROXY = 'not-a-valid-url';
|
||||
process.env.HTTP_PROXY = 'http://http-proxy:8080';
|
||||
|
||||
expect(getProxyResolution(true, process.env, { allowedProtocols: ['http:', 'https:'] })).toEqual(
|
||||
{
|
||||
url: 'http://http-proxy:8080',
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
it('preserves socks proxy URLs when no protocol restriction is requested', () => {
|
||||
process.env.https_proxy = 'socks5://proxy:1080';
|
||||
|
||||
expect(getProxyResolution(true)).toEqual({ url: 'socks5://proxy:1080' });
|
||||
});
|
||||
|
||||
it('falls back from unsupported HTTPS_PROXY to valid ALL_PROXY when protocols are restricted', () => {
|
||||
process.env.https_proxy = 'socks5://proxy:1080';
|
||||
process.env.ALL_PROXY = 'http://all-proxy:8080';
|
||||
|
||||
expect(getProxyResolution(true, process.env, { allowedProtocols: ['http:', 'https:'] })).toEqual(
|
||||
{
|
||||
url: 'http://all-proxy:8080',
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
it('returns an error when only invalid proxy env values are configured for restricted protocols', () => {
|
||||
process.env.https_proxy = 'socks5://proxy:1080';
|
||||
process.env.HTTP_PROXY = 'not-a-valid-url';
|
||||
|
||||
expect(getProxyResolution(true, process.env, { allowedProtocols: ['http:', 'https:'] })).toEqual(
|
||||
{
|
||||
error: 'Unsupported proxy protocol: socks5:',
|
||||
}
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe('shouldBypassProxy', () => {
|
||||
it('automatically bypasses loopback hosts without NO_PROXY', () => {
|
||||
expect(shouldBypassProxy('localhost')).toBe(true);
|
||||
expect(shouldBypassProxy('api.localhost')).toBe(true);
|
||||
expect(shouldBypassProxy('0.0.0.0')).toBe(true);
|
||||
expect(shouldBypassProxy('127.0.0.2')).toBe(true);
|
||||
expect(shouldBypassProxy('::1')).toBe(true);
|
||||
expect(shouldBypassProxy('::ffff:127.0.0.1')).toBe(true);
|
||||
expect(shouldBypassProxy('::ffff:7f00:1')).toBe(true);
|
||||
});
|
||||
|
||||
it('supports wildcard NO_PROXY domain suffix patterns', () => {
|
||||
process.env.NO_PROXY = '*.example.com';
|
||||
|
||||
expect(shouldBypassProxy('example.com')).toBe(true);
|
||||
expect(shouldBypassProxy('api.example.com')).toBe(true);
|
||||
expect(shouldBypassProxy('other.test')).toBe(false);
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user