thejagstudio's picture
Upload 56 files
b32c7e6 verified
/* jshint mocha:true */
'use strict';
var assert = require('assert');
var getProxyForUrl = require('./').getProxyForUrl;
describe('getProxyForUrl', function() {
beforeEach(function() {
// Remove all proxy-related environment variables.
Object.keys(process.env).forEach(function(key) {
if (/proxy/i.test(key)) {
delete process.env[key];
}
});
});
it('No proxy variables', function() {
assert.strictEqual('', getProxyForUrl('http://example.com'));
assert.strictEqual('', getProxyForUrl('https://example.com'));
assert.strictEqual('', getProxyForUrl('ftp://example.com'));
});
it('Invalid URLs', function() {
process.env.ALL_PROXY = 'http://unexpected.proxy';
assert.strictEqual('', getProxyForUrl('bogus'));
assert.strictEqual('', getProxyForUrl('//example.com'));
assert.strictEqual('', getProxyForUrl('/path'));
assert.strictEqual('', getProxyForUrl(''));
assert.throws(function() {
getProxyForUrl();
}, TypeError); // "Parameter 'url' must be a string, not undefined"
assert.throws(function() {
getProxyForUrl({});
}, TypeError); // "Parameter 'url' must be a string, not object"
});
it('http_proxy and HTTP_PROXY', function() {
process.env.HTTP_PROXY = 'http://http-proxy';
assert.strictEqual('', getProxyForUrl('https://example'));
assert.strictEqual('http://http-proxy', getProxyForUrl('http://example'));
process.env.http_proxy = 'http://priority';
assert.strictEqual('http://priority', getProxyForUrl('http://example'));
});
it('http_proxy with non-sensical value', function() {
// Crazy values should be passed as-is. It is the responsibility of the
// one who launches the application that the value makes sense.
// TODO: Should we be stricter and perform validation?
process.env.http_proxy = 'Crazy \n!() { :: }';
assert.strictEqual('Crazy \n!() { :: }', getProxyForUrl('http://wow'));
});
it('https_proxy and HTTPS_PROXY', function() {
// Assert that there is no fall back to http_proxy
process.env.HTTP_PROXY = 'http://unexpected.proxy';
assert.strictEqual('', getProxyForUrl('https://example'));
process.env.HTTPS_PROXY = 'http://https-proxy';
assert.strictEqual('http://https-proxy', getProxyForUrl('https://example'));
process.env.https_proxy = 'http://priority';
assert.strictEqual('http://priority', getProxyForUrl('https://example'));
});
it('ftp_proxy', function() {
// Something else than http_proxy / https, as a sanity check.
process.env.ftp_proxy = 'http://ftp-proxy';
assert.strictEqual('http://ftp-proxy', getProxyForUrl('ftp://example'));
assert.strictEqual('', getProxyForUrl('ftps://example'));
});
it('all_proxy', function() {
process.env.ALL_PROXY = 'http://catch-all';
assert.strictEqual('http://catch-all', getProxyForUrl('https://example'));
process.env.all_proxy = 'http://priority';
assert.strictEqual('http://priority', getProxyForUrl('https://example'));
});
it('no_proxy empty', function() {
process.env.ALL_PROXY = 'http://proxy';
// NO_PROXY set but empty.
process.env.NO_PROXY = '';
assert.strictEqual('http://proxy', getProxyForUrl('https://example'));
// No entries in NO_PROXY (comma).
process.env.NO_PROXY = ',';
assert.strictEqual('http://proxy', getProxyForUrl('https://example'));
// No entries in NO_PROXY (whitespace).
process.env.NO_PROXY = ' ';
assert.strictEqual('http://proxy', getProxyForUrl('https://example'));
// No entries in NO_PROXY (multiple whitespace / commas).
process.env.NO_PROXY = ',\t,,,\n, ,\r';
assert.strictEqual('http://proxy', getProxyForUrl('https://example'));
});
it('no_proxy=example (single host)', function() {
process.env.ALL_PROXY = 'http://proxy';
process.env.NO_PROXY = 'example';
assert.strictEqual('', getProxyForUrl('http://example'));
assert.strictEqual('', getProxyForUrl('http://example:80'));
assert.strictEqual('', getProxyForUrl('http://example:0'));
assert.strictEqual('', getProxyForUrl('http://example:1337'));
assert.strictEqual('http://proxy', getProxyForUrl('http://sub.example'));
assert.strictEqual('http://proxy', getProxyForUrl('http://prefexample'));
assert.strictEqual('http://proxy', getProxyForUrl('http://example.no'));
assert.strictEqual('http://proxy', getProxyForUrl('http://a.b.example'));
assert.strictEqual('http://proxy', getProxyForUrl('http://host/example'));
});
it('no_proxy=sub.example (subdomain)', function() {
process.env.ALL_PROXY = 'http://proxy';
process.env.NO_PROXY = 'sub.example';
assert.strictEqual('http://proxy', getProxyForUrl('http://example'));
assert.strictEqual('http://proxy', getProxyForUrl('http://example:80'));
assert.strictEqual('http://proxy', getProxyForUrl('http://example:0'));
assert.strictEqual('http://proxy', getProxyForUrl('http://example:1337'));
assert.strictEqual('', getProxyForUrl('http://sub.example'));
assert.strictEqual('http://proxy', getProxyForUrl('http://no.sub.example'));
assert.strictEqual('http://proxy', getProxyForUrl('http://sub-example'));
assert.strictEqual('http://proxy', getProxyForUrl('http://example.sub'));
});
it('no_proxy=example:80 (host + port)', function() {
process.env.ALL_PROXY = 'http://proxy';
process.env.NO_PROXY = 'example:80';
assert.strictEqual('', getProxyForUrl('http://example'));
assert.strictEqual('', getProxyForUrl('http://example:80'));
assert.strictEqual('', getProxyForUrl('http://example:0'));
assert.strictEqual('http://proxy', getProxyForUrl('http://example:1337'));
assert.strictEqual('http://proxy', getProxyForUrl('http://sub.example'));
assert.strictEqual('http://proxy', getProxyForUrl('http://prefexample'));
assert.strictEqual('http://proxy', getProxyForUrl('http://example.no'));
assert.strictEqual('http://proxy', getProxyForUrl('http://a.b.example'));
});
it('no_proxy=.example (host suffix)', function() {
process.env.ALL_PROXY = 'http://proxy';
process.env.NO_PROXY = '.example';
assert.strictEqual('http://proxy', getProxyForUrl('http://example'));
assert.strictEqual('http://proxy', getProxyForUrl('http://example:80'));
assert.strictEqual('http://proxy', getProxyForUrl('http://example:1337'));
assert.strictEqual('', getProxyForUrl('http://sub.example'));
assert.strictEqual('', getProxyForUrl('http://sub.example:80'));
assert.strictEqual('', getProxyForUrl('http://sub.example:1337'));
assert.strictEqual('http://proxy', getProxyForUrl('http://prefexample'));
assert.strictEqual('http://proxy', getProxyForUrl('http://example.no'));
assert.strictEqual('', getProxyForUrl('http://a.b.example'));
});
it('no_proxy=*.example (host suffix with *.)', function() {
process.env.ALL_PROXY = 'http://proxy';
process.env.NO_PROXY = '*.example';
assert.strictEqual('http://proxy', getProxyForUrl('http://example'));
assert.strictEqual('http://proxy', getProxyForUrl('http://example:80'));
assert.strictEqual('http://proxy', getProxyForUrl('http://example:1337'));
assert.strictEqual('', getProxyForUrl('http://sub.example'));
assert.strictEqual('', getProxyForUrl('http://sub.example:80'));
assert.strictEqual('', getProxyForUrl('http://sub.example:1337'));
assert.strictEqual('http://proxy', getProxyForUrl('http://prefexample'));
assert.strictEqual('http://proxy', getProxyForUrl('http://example.no'));
assert.strictEqual('', getProxyForUrl('http://a.b.example'));
});
it('no_proxy=*example (substring suffix)', function() {
process.env.ALL_PROXY = 'http://proxy';
process.env.NO_PROXY = '*example';
assert.strictEqual('', getProxyForUrl('http://example'));
assert.strictEqual('', getProxyForUrl('http://example:80'));
assert.strictEqual('', getProxyForUrl('http://example:1337'));
assert.strictEqual('', getProxyForUrl('http://sub.example'));
assert.strictEqual('', getProxyForUrl('http://sub.example:80'));
assert.strictEqual('', getProxyForUrl('http://sub.example:1337'));
assert.strictEqual('', getProxyForUrl('http://prefexample'));
assert.strictEqual('', getProxyForUrl('http://a.b.example'));
assert.strictEqual('http://proxy', getProxyForUrl('http://example.no'));
assert.strictEqual('http://proxy', getProxyForUrl('http://host/example'));
});
it('no_proxy=.*example (arbitrary wildcards are NOT supported)', function() {
process.env.ALL_PROXY = 'http://proxy';
process.env.NO_PROXY = '.*example';
assert.strictEqual('http://proxy', getProxyForUrl('http://example'));
assert.strictEqual('http://proxy', getProxyForUrl('http://sub.example'));
assert.strictEqual('http://proxy', getProxyForUrl('http://sub.example'));
assert.strictEqual('http://proxy', getProxyForUrl('http://prefexample'));
assert.strictEqual('http://proxy', getProxyForUrl('http://x.prefexample'));
assert.strictEqual('http://proxy', getProxyForUrl('http://a.b.example'));
});
it('no_proxy=[::1],[::2]:80,10.0.0.1,10.0.0.2:80 (IP addresses)', function() {
process.env.ALL_PROXY = 'http://proxy';
process.env.NO_PROXY = '[::1],[::2]:80,10.0.0.1,10.0.0.2:80';
assert.strictEqual('', getProxyForUrl('http://[::1]/'));
assert.strictEqual('', getProxyForUrl('http://[::1]:80/'));
assert.strictEqual('', getProxyForUrl('http://[::1]:1337/'));
assert.strictEqual('', getProxyForUrl('http://[::2]/'));
assert.strictEqual('', getProxyForUrl('http://[::2]:80/'));
assert.strictEqual('http://proxy', getProxyForUrl('http://[::2]:1337/'));
assert.strictEqual('', getProxyForUrl('http://10.0.0.1/'));
assert.strictEqual('', getProxyForUrl('http://10.0.0.1:80/'));
assert.strictEqual('', getProxyForUrl('http://10.0.0.1:1337/'));
assert.strictEqual('', getProxyForUrl('http://10.0.0.2/'));
assert.strictEqual('', getProxyForUrl('http://10.0.0.2:80/'));
assert.strictEqual('http://proxy', getProxyForUrl('http://10.0.0.2:1337/'));
});
it('no_proxy=127.0.0.1/32 (CIDR is NOT supported)', function() {
process.env.ALL_PROXY = 'http://proxy';
process.env.NO_PROXY = '127.0.0.1/32';
assert.strictEqual('http://proxy', getProxyForUrl('http://127.0.0.1'));
assert.strictEqual('http://proxy', getProxyForUrl('http://127.0.0.1/32'));
});
it('no_proxy=127.0.0.1 does NOT match localhost', function() {
process.env.ALL_PROXY = 'http://proxy';
process.env.NO_PROXY = '127.0.0.1';
assert.strictEqual('', getProxyForUrl('http://127.0.0.1'));
// We're not performing DNS queries, so this shouldn't match.
assert.strictEqual('http://proxy', getProxyForUrl('http://localhost'));
});
it('no_proxy with protocols that have a default port', function() {
process.env.WS_PROXY = 'http://ws';
process.env.WSS_PROXY = 'http://wss';
process.env.HTTP_PROXY = 'http://http';
process.env.HTTPS_PROXY = 'http://https';
process.env.GOPHER_PROXY = 'http://gopher';
process.env.FTP_PROXY = 'http://ftp';
process.env.ALL_PROXY = 'http://all';
process.env.NO_PROXY = 'xxx:21,xxx:70,xxx:80,xxx:443';
assert.strictEqual('', getProxyForUrl('http://xxx'));
assert.strictEqual('', getProxyForUrl('http://xxx:80'));
assert.strictEqual('http://http', getProxyForUrl('http://xxx:1337'));
assert.strictEqual('', getProxyForUrl('ws://xxx'));
assert.strictEqual('', getProxyForUrl('ws://xxx:80'));
assert.strictEqual('http://ws', getProxyForUrl('ws://xxx:1337'));
assert.strictEqual('', getProxyForUrl('https://xxx'));
assert.strictEqual('', getProxyForUrl('https://xxx:443'));
assert.strictEqual('http://https', getProxyForUrl('https://xxx:1337'));
assert.strictEqual('', getProxyForUrl('wss://xxx'));
assert.strictEqual('', getProxyForUrl('wss://xxx:443'));
assert.strictEqual('http://wss', getProxyForUrl('wss://xxx:1337'));
assert.strictEqual('', getProxyForUrl('gopher://xxx'));
assert.strictEqual('', getProxyForUrl('gopher://xxx:70'));
assert.strictEqual('http://gopher', getProxyForUrl('gopher://xxx:1337'));
assert.strictEqual('', getProxyForUrl('ftp://xxx'));
assert.strictEqual('', getProxyForUrl('ftp://xxx:21'));
assert.strictEqual('http://ftp', getProxyForUrl('ftp://xxx:1337'));
});
});