| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- const DEFAULT_PORTS = {
- http: 80,
- https: 443,
- ws: 80,
- wss: 443,
- ftp: 21,
- };
- const parseNoProxyEntry = (entry) => {
- let entryHost = entry;
- let entryPort = 0;
- if (entryHost.charAt(0) === '[') {
- const bracketIndex = entryHost.indexOf(']');
- if (bracketIndex !== -1) {
- const host = entryHost.slice(1, bracketIndex);
- const rest = entryHost.slice(bracketIndex + 1);
- if (rest.charAt(0) === ':' && /^\d+$/.test(rest.slice(1))) {
- entryPort = Number.parseInt(rest.slice(1), 10);
- }
- return [host, entryPort];
- }
- }
- const firstColon = entryHost.indexOf(':');
- const lastColon = entryHost.lastIndexOf(':');
- if (
- firstColon !== -1 &&
- firstColon === lastColon &&
- /^\d+$/.test(entryHost.slice(lastColon + 1))
- ) {
- entryPort = Number.parseInt(entryHost.slice(lastColon + 1), 10);
- entryHost = entryHost.slice(0, lastColon);
- }
- return [entryHost, entryPort];
- };
- const normalizeNoProxyHost = (hostname) => {
- if (!hostname) {
- return hostname;
- }
- if (hostname.charAt(0) === '[' && hostname.charAt(hostname.length - 1) === ']') {
- hostname = hostname.slice(1, -1);
- }
- return hostname.replace(/\.+$/, '');
- };
- export default function shouldBypassProxy(location) {
- let parsed;
- try {
- parsed = new URL(location);
- } catch (_err) {
- return false;
- }
- const noProxy = (process.env.no_proxy || process.env.NO_PROXY || '').toLowerCase();
- if (!noProxy) {
- return false;
- }
- if (noProxy === '*') {
- return true;
- }
- const port =
- Number.parseInt(parsed.port, 10) || DEFAULT_PORTS[parsed.protocol.split(':', 1)[0]] || 0;
- const hostname = normalizeNoProxyHost(parsed.hostname.toLowerCase());
- return noProxy.split(/[\s,]+/).some((entry) => {
- if (!entry) {
- return false;
- }
- let [entryHost, entryPort] = parseNoProxyEntry(entry);
- entryHost = normalizeNoProxyHost(entryHost);
- if (!entryHost) {
- return false;
- }
- if (entryPort && entryPort !== port) {
- return false;
- }
- if (entryHost.charAt(0) === '*') {
- entryHost = entryHost.slice(1);
- }
- if (entryHost.charAt(0) === '.') {
- return hostname.endsWith(entryHost);
- }
- return hostname === entryHost;
- });
- }
|