opusdev/vector-similarity-api
1
1/* eslint max-statements:0 */2'use strict';3 4var assert = require('assert');5var parseUrl = require('url').parse;6 7var getProxyForUrl = require('./').getProxyForUrl;8 9// Runs the callback with process.env temporarily set to env.10function runWithEnv(env, callback) {11 var originalEnv = process.env;12 process.env = env;13 try {14 callback();15 } finally {16 process.env = originalEnv;17 }18}19 20// Defines a test case that checks whether getProxyForUrl(input) === expected.21function testProxyUrl(env, expected, input) {22 assert(typeof env === 'object' && env !== null);23 // Copy object to make sure that the in param does not get modified between24 // the call of this function and the use of it below.25 env = JSON.parse(JSON.stringify(env));26 27 var title = 'getProxyForUrl(' + JSON.stringify(input) + ')' +28 ' === ' + JSON.stringify(expected);29 30 // Save call stack for later use.31 var stack = {};32 Error.captureStackTrace(stack, testProxyUrl);33 // Only use the last stack frame because that shows where this function is34 // called, and that is sufficient for our purpose. No need to flood the logs35 // with an uninteresting stack trace.36 stack = stack.stack.split('\n', 2)[1];37 38 it(title, function() {39 var actual;40 runWithEnv(env, function() {41 actual = getProxyForUrl(input);42 });43 if (expected === actual) {44 return; // Good!45 }46 try {47 assert.strictEqual(expected, actual); // Create a formatted error message.48 // Should not happen because previously we determined expected !== actual.49 throw new Error('assert.strictEqual passed. This is impossible!');50 } catch (e) {51 // Use the original stack trace, so we can see a helpful line number.52 e.stack = e.message + stack;53 throw e;54 }55 });56}57 58describe('getProxyForUrl', function() {59 describe('No proxy variables', function() {60 var env = {};61 testProxyUrl(env, '', 'http://example.com');62 testProxyUrl(env, '', 'https://example.com');63 testProxyUrl(env, '', 'ftp://example.com');64 });65 66 describe('Invalid URLs', function() {67 var env = {};68 env.ALL_PROXY = 'http://unexpected.proxy';69 testProxyUrl(env, '', 'bogus');70 testProxyUrl(env, '', '//example.com');71 testProxyUrl(env, '', '://example.com');72 testProxyUrl(env, '', '://');73 testProxyUrl(env, '', '/path');74 testProxyUrl(env, '', '');75 testProxyUrl(env, '', 'http:');76 testProxyUrl(env, '', 'http:/');77 testProxyUrl(env, '', 'http://');78 testProxyUrl(env, '', 'prototype://');79 testProxyUrl(env, '', 'hasOwnProperty://');80 testProxyUrl(env, '', '__proto__://');81 testProxyUrl(env, '', undefined);82 testProxyUrl(env, '', null);83 testProxyUrl(env, '', {});84 testProxyUrl(env, '', {host: 'x', protocol: 1});85 testProxyUrl(env, '', {host: 1, protocol: 'x'});86 });87 88 describe('http_proxy and HTTP_PROXY', function() {89 var env = {};90 env.HTTP_PROXY = 'http://http-proxy';91 92 testProxyUrl(env, '', 'https://example');93 testProxyUrl(env, 'http://http-proxy', 'http://example');94 testProxyUrl(env, 'http://http-proxy', parseUrl('http://example'));95 96 // eslint-disable-next-line camelcase97 env.http_proxy = 'http://priority';98 testProxyUrl(env, 'http://priority', 'http://example');99 });100 101 describe('http_proxy with non-sensical value', function() {102 var env = {};103 // Crazy values should be passed as-is. It is the responsibility of the104 // one who launches the application that the value makes sense.105 // TODO: Should we be stricter and perform validation?106 env.HTTP_PROXY = 'Crazy \n!() { ::// }';107 testProxyUrl(env, 'Crazy \n!() { ::// }', 'http://wow');108 109 // The implementation assumes that the HTTP_PROXY environment variable is110 // somewhat reasonable, and if the scheme is missing, it is added.111 // Garbage in, garbage out some would say...112 env.HTTP_PROXY = 'crazy without colon slash slash';113 testProxyUrl(env, 'http://crazy without colon slash slash', 'http://wow');114 });115 116 describe('https_proxy and HTTPS_PROXY', function() {117 var env = {};118 // Assert that there is no fall back to http_proxy119 env.HTTP_PROXY = 'http://unexpected.proxy';120 testProxyUrl(env, '', 'https://example');121 122 env.HTTPS_PROXY = 'http://https-proxy';123 testProxyUrl(env, 'http://https-proxy', 'https://example');124 125 // eslint-disable-next-line camelcase126 env.https_proxy = 'http://priority';127 testProxyUrl(env, 'http://priority', 'https://example');128 });129 130 describe('ftp_proxy', function() {131 var env = {};132 // Something else than http_proxy / https, as a sanity check.133 env.FTP_PROXY = 'http://ftp-proxy';134 135 testProxyUrl(env, 'http://ftp-proxy', 'ftp://example');136 testProxyUrl(env, '', 'ftps://example');137 });138 139 describe('all_proxy', function() {140 var env = {};141 env.ALL_PROXY = 'http://catch-all';142 testProxyUrl(env, 'http://catch-all', 'https://example');143 144 // eslint-disable-next-line camelcase145 env.all_proxy = 'http://priority';146 testProxyUrl(env, 'http://priority', 'https://example');147 });148 149 describe('all_proxy without scheme', function() {150 var env = {};151 env.ALL_PROXY = 'noscheme';152 testProxyUrl(env, 'http://noscheme', 'http://example');153 testProxyUrl(env, 'https://noscheme', 'https://example');154 155 // The module does not impose restrictions on the scheme.156 testProxyUrl(env, 'bogus-scheme://noscheme', 'bogus-scheme://example');157 158 // But the URL should still be valid.159 testProxyUrl(env, '', 'bogus');160 });161 162 describe('no_proxy empty', function() {163 var env = {};164 env.HTTPS_PROXY = 'http://proxy';165 166 // NO_PROXY set but empty.167 env.NO_PROXY = '';168 testProxyUrl(env, 'http://proxy', 'https://example');169 170 // No entries in NO_PROXY (comma).171 env.NO_PROXY = ',';172 testProxyUrl(env, 'http://proxy', 'https://example');173 174 // No entries in NO_PROXY (whitespace).175 env.NO_PROXY = ' ';176 testProxyUrl(env, 'http://proxy', 'https://example');177 178 // No entries in NO_PROXY (multiple whitespace / commas).179 env.NO_PROXY = ',\t,,,\n, ,\r';180 testProxyUrl(env, 'http://proxy', 'https://example');181 });182 183 describe('no_proxy=example (single host)', function() {184 var env = {};185 env.HTTP_PROXY = 'http://proxy';186 187 env.NO_PROXY = 'example';188 testProxyUrl(env, '', 'http://example');189 testProxyUrl(env, '', 'http://example:80');190 testProxyUrl(env, '', 'http://example:0');191 testProxyUrl(env, '', 'http://example:1337');192 testProxyUrl(env, 'http://proxy', 'http://sub.example');193 testProxyUrl(env, 'http://proxy', 'http://prefexample');194 testProxyUrl(env, 'http://proxy', 'http://example.no');195 testProxyUrl(env, 'http://proxy', 'http://a.b.example');196 testProxyUrl(env, 'http://proxy', 'http://host/example');197 });198 199 describe('no_proxy=sub.example (subdomain)', function() {200 var env = {};201 env.HTTP_PROXY = 'http://proxy';202 203 env.NO_PROXY = 'sub.example';204 testProxyUrl(env, 'http://proxy', 'http://example');205 testProxyUrl(env, 'http://proxy', 'http://example:80');206 testProxyUrl(env, 'http://proxy', 'http://example:0');207 testProxyUrl(env, 'http://proxy', 'http://example:1337');208 testProxyUrl(env, '', 'http://sub.example');209 testProxyUrl(env, 'http://proxy', 'http://no.sub.example');210 testProxyUrl(env, 'http://proxy', 'http://sub-example');211 testProxyUrl(env, 'http://proxy', 'http://example.sub');212 });213 214 describe('no_proxy=example:80 (host + port)', function() {215 var env = {};216 env.HTTP_PROXY = 'http://proxy';217 218 env.NO_PROXY = 'example:80';219 testProxyUrl(env, '', 'http://example');220 testProxyUrl(env, '', 'http://example:80');221 testProxyUrl(env, '', 'http://example:0');222 testProxyUrl(env, 'http://proxy', 'http://example:1337');223 testProxyUrl(env, 'http://proxy', 'http://sub.example');224 testProxyUrl(env, 'http://proxy', 'http://prefexample');225 testProxyUrl(env, 'http://proxy', 'http://example.no');226 testProxyUrl(env, 'http://proxy', 'http://a.b.example');227 });228 229 describe('no_proxy=.example (host suffix)', function() {230 var env = {};231 env.HTTP_PROXY = 'http://proxy';232 233 env.NO_PROXY = '.example';234 testProxyUrl(env, 'http://proxy', 'http://example');235 testProxyUrl(env, 'http://proxy', 'http://example:80');236 testProxyUrl(env, 'http://proxy', 'http://example:1337');237 testProxyUrl(env, '', 'http://sub.example');238 testProxyUrl(env, '', 'http://sub.example:80');239 testProxyUrl(env, '', 'http://sub.example:1337');240 testProxyUrl(env, 'http://proxy', 'http://prefexample');241 testProxyUrl(env, 'http://proxy', 'http://example.no');242 testProxyUrl(env, '', 'http://a.b.example');243 });244 245 describe('no_proxy=*', function() {246 var env = {};247 env.HTTP_PROXY = 'http://proxy';248 env.NO_PROXY = '*';249 testProxyUrl(env, '', 'http://example.com');250 });251 252 describe('no_proxy=*.example (host suffix with *.)', function() {253 var env = {};254 env.HTTP_PROXY = 'http://proxy';255 256 env.NO_PROXY = '*.example';257 testProxyUrl(env, 'http://proxy', 'http://example');258 testProxyUrl(env, 'http://proxy', 'http://example:80');259 testProxyUrl(env, 'http://proxy', 'http://example:1337');260 testProxyUrl(env, '', 'http://sub.example');261 testProxyUrl(env, '', 'http://sub.example:80');262 testProxyUrl(env, '', 'http://sub.example:1337');263 testProxyUrl(env, 'http://proxy', 'http://prefexample');264 testProxyUrl(env, 'http://proxy', 'http://example.no');265 testProxyUrl(env, '', 'http://a.b.example');266 });267 268 describe('no_proxy=*example (substring suffix)', function() {269 var env = {};270 env.HTTP_PROXY = 'http://proxy';271 272 env.NO_PROXY = '*example';273 testProxyUrl(env, '', 'http://example');274 testProxyUrl(env, '', 'http://example:80');275 testProxyUrl(env, '', 'http://example:1337');276 testProxyUrl(env, '', 'http://sub.example');277 testProxyUrl(env, '', 'http://sub.example:80');278 testProxyUrl(env, '', 'http://sub.example:1337');279 testProxyUrl(env, '', 'http://prefexample');280 testProxyUrl(env, '', 'http://a.b.example');281 testProxyUrl(env, 'http://proxy', 'http://example.no');282 testProxyUrl(env, 'http://proxy', 'http://host/example');283 });284 285 describe('no_proxy=.*example (arbitrary wildcards are NOT supported)',286 function() {287 var env = {};288 env.HTTP_PROXY = 'http://proxy';289 290 env.NO_PROXY = '.*example';291 testProxyUrl(env, 'http://proxy', 'http://example');292 testProxyUrl(env, 'http://proxy', 'http://sub.example');293 testProxyUrl(env, 'http://proxy', 'http://sub.example');294 testProxyUrl(env, 'http://proxy', 'http://prefexample');295 testProxyUrl(env, 'http://proxy', 'http://x.prefexample');296 testProxyUrl(env, 'http://proxy', 'http://a.b.example');297 });298 299 describe('no_proxy=[::1],[::2]:80,10.0.0.1,10.0.0.2:80 (IP addresses)',300 function() {301 var env = {};302 env.HTTP_PROXY = 'http://proxy';303 304 env.NO_PROXY = '[::1],[::2]:80,10.0.0.1,10.0.0.2:80';305 testProxyUrl(env, '', 'http://[::1]/');306 testProxyUrl(env, '', 'http://[::1]:80/');307 testProxyUrl(env, '', 'http://[::1]:1337/');308 309 testProxyUrl(env, '', 'http://[::2]/');310 testProxyUrl(env, '', 'http://[::2]:80/');311 testProxyUrl(env, 'http://proxy', 'http://[::2]:1337/');312 313 testProxyUrl(env, '', 'http://10.0.0.1/');314 testProxyUrl(env, '', 'http://10.0.0.1:80/');315 testProxyUrl(env, '', 'http://10.0.0.1:1337/');316 317 testProxyUrl(env, '', 'http://10.0.0.2/');318 testProxyUrl(env, '', 'http://10.0.0.2:80/');319 testProxyUrl(env, 'http://proxy', 'http://10.0.0.2:1337/');320 });321 322 describe('no_proxy=127.0.0.1/32 (CIDR is NOT supported)', function() {323 var env = {};324 env.HTTP_PROXY = 'http://proxy';325 326 env.NO_PROXY = '127.0.0.1/32';327 testProxyUrl(env, 'http://proxy', 'http://127.0.0.1');328 testProxyUrl(env, 'http://proxy', 'http://127.0.0.1/32');329 });330 331 describe('no_proxy=127.0.0.1 does NOT match localhost', function() {332 var env = {};333 env.HTTP_PROXY = 'http://proxy';334 335 env.NO_PROXY = '127.0.0.1';336 testProxyUrl(env, '', 'http://127.0.0.1');337 // We're not performing DNS queries, so this shouldn't match.338 testProxyUrl(env, 'http://proxy', 'http://localhost');339 });340 341 describe('no_proxy with protocols that have a default port', function() {342 var env = {};343 env.WS_PROXY = 'http://ws';344 env.WSS_PROXY = 'http://wss';345 env.HTTP_PROXY = 'http://http';346 env.HTTPS_PROXY = 'http://https';347 env.GOPHER_PROXY = 'http://gopher';348 env.FTP_PROXY = 'http://ftp';349 env.ALL_PROXY = 'http://all';350 351 env.NO_PROXY = 'xxx:21,xxx:70,xxx:80,xxx:443';352 353 testProxyUrl(env, '', 'http://xxx');354 testProxyUrl(env, '', 'http://xxx:80');355 testProxyUrl(env, 'http://http', 'http://xxx:1337');356 357 testProxyUrl(env, '', 'ws://xxx');358 testProxyUrl(env, '', 'ws://xxx:80');359 testProxyUrl(env, 'http://ws', 'ws://xxx:1337');360 361 testProxyUrl(env, '', 'https://xxx');362 testProxyUrl(env, '', 'https://xxx:443');363 testProxyUrl(env, 'http://https', 'https://xxx:1337');364 365 testProxyUrl(env, '', 'wss://xxx');366 testProxyUrl(env, '', 'wss://xxx:443');367 testProxyUrl(env, 'http://wss', 'wss://xxx:1337');368 369 testProxyUrl(env, '', 'gopher://xxx');370 testProxyUrl(env, '', 'gopher://xxx:70');371 testProxyUrl(env, 'http://gopher', 'gopher://xxx:1337');372 373 testProxyUrl(env, '', 'ftp://xxx');374 testProxyUrl(env, '', 'ftp://xxx:21');375 testProxyUrl(env, 'http://ftp', 'ftp://xxx:1337');376 });377 378 describe('no_proxy should not be case-sensitive', function() {379 var env = {};380 env.HTTP_PROXY = 'http://proxy';381 env.NO_PROXY = 'XXX,YYY,ZzZ';382 383 testProxyUrl(env, '', 'http://xxx');384 testProxyUrl(env, '', 'http://XXX');385 testProxyUrl(env, '', 'http://yyy');386 testProxyUrl(env, '', 'http://YYY');387 testProxyUrl(env, '', 'http://ZzZ');388 testProxyUrl(env, '', 'http://zZz');389 });390 391 describe('NPM proxy configuration', function() {392 describe('npm_config_http_proxy should work', function() {393 var env = {};394 // eslint-disable-next-line camelcase395 env.npm_config_http_proxy = 'http://http-proxy';396 397 testProxyUrl(env, '', 'https://example');398 testProxyUrl(env, 'http://http-proxy', 'http://example');399 400 // eslint-disable-next-line camelcase401 env.npm_config_http_proxy = 'http://priority';402 testProxyUrl(env, 'http://priority', 'http://example');403 });404 // eslint-disable-next-line max-len405 describe('npm_config_http_proxy should take precedence over HTTP_PROXY and npm_config_proxy', function() {406 var env = {};407 // eslint-disable-next-line camelcase408 env.npm_config_http_proxy = 'http://http-proxy';409 // eslint-disable-next-line camelcase410 env.npm_config_proxy = 'http://unexpected-proxy';411 env.HTTP_PROXY = 'http://unexpected-proxy';412 413 testProxyUrl(env, 'http://http-proxy', 'http://example');414 });415 describe('npm_config_https_proxy should work', function() {416 var env = {};417 // eslint-disable-next-line camelcase418 env.npm_config_http_proxy = 'http://unexpected.proxy';419 testProxyUrl(env, '', 'https://example');420 421 // eslint-disable-next-line camelcase422 env.npm_config_https_proxy = 'http://https-proxy';423 testProxyUrl(env, 'http://https-proxy', 'https://example');424 425 // eslint-disable-next-line camelcase426 env.npm_config_https_proxy = 'http://priority';427 testProxyUrl(env, 'http://priority', 'https://example');428 });429 // eslint-disable-next-line max-len430 describe('npm_config_https_proxy should take precedence over HTTPS_PROXY and npm_config_proxy', function() {431 var env = {};432 // eslint-disable-next-line camelcase433 env.npm_config_https_proxy = 'http://https-proxy';434 // eslint-disable-next-line camelcase435 env.npm_config_proxy = 'http://unexpected-proxy';436 env.HTTPS_PROXY = 'http://unexpected-proxy';437 438 testProxyUrl(env, 'http://https-proxy', 'https://example');439 });440 describe('npm_config_proxy should work', function() {441 var env = {};442 // eslint-disable-next-line camelcase443 env.npm_config_proxy = 'http://http-proxy';444 testProxyUrl(env, 'http://http-proxy', 'http://example');445 testProxyUrl(env, 'http://http-proxy', 'https://example');446 447 // eslint-disable-next-line camelcase448 env.npm_config_proxy = 'http://priority';449 testProxyUrl(env, 'http://priority', 'http://example');450 testProxyUrl(env, 'http://priority', 'https://example');451 });452 // eslint-disable-next-line max-len453 describe('HTTP_PROXY and HTTPS_PROXY should take precedence over npm_config_proxy', function() {454 var env = {};455 env.HTTP_PROXY = 'http://http-proxy';456 env.HTTPS_PROXY = 'http://https-proxy';457 // eslint-disable-next-line camelcase458 env.npm_config_proxy = 'http://unexpected-proxy';459 testProxyUrl(env, 'http://http-proxy', 'http://example');460 testProxyUrl(env, 'http://https-proxy', 'https://example');461 });462 describe('npm_config_no_proxy should work', function() {463 var env = {};464 env.HTTP_PROXY = 'http://proxy';465 // eslint-disable-next-line camelcase466 env.npm_config_no_proxy = 'example';467 468 testProxyUrl(env, '', 'http://example');469 testProxyUrl(env, 'http://proxy', 'http://otherwebsite');470 });471 // eslint-disable-next-line max-len472 describe('npm_config_no_proxy should take precedence over NO_PROXY', function() {473 var env = {};474 env.HTTP_PROXY = 'http://proxy';475 env.NO_PROXY = 'otherwebsite';476 // eslint-disable-next-line camelcase477 env.npm_config_no_proxy = 'example';478 479 testProxyUrl(env, '', 'http://example');480 testProxyUrl(env, 'http://proxy', 'http://otherwebsite');481 });482 });483});484 