source: imaps-frontend/node_modules/proxy-from-env/test.js

main
Last change on this file was d565449, checked in by stefan toskovski <stefantoska84@…>, 4 weeks ago

Update repo after prototype presentation

  • Property mode set to 100644
File size: 17.3 KB
RevLine 
[d565449]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 between
24 // 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 is
34 // called, and that is sufficient for our purpose. No need to flood the logs
35 // 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 camelcase
97 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 the
104 // 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 is
110 // 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_proxy
119 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 camelcase
126 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 camelcase
145 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 camelcase
395 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 camelcase
401 env.npm_config_http_proxy = 'http://priority';
402 testProxyUrl(env, 'http://priority', 'http://example');
403 });
404 // eslint-disable-next-line max-len
405 describe('npm_config_http_proxy should take precedence over HTTP_PROXY and npm_config_proxy', function() {
406 var env = {};
407 // eslint-disable-next-line camelcase
408 env.npm_config_http_proxy = 'http://http-proxy';
409 // eslint-disable-next-line camelcase
410 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 camelcase
418 env.npm_config_http_proxy = 'http://unexpected.proxy';
419 testProxyUrl(env, '', 'https://example');
420
421 // eslint-disable-next-line camelcase
422 env.npm_config_https_proxy = 'http://https-proxy';
423 testProxyUrl(env, 'http://https-proxy', 'https://example');
424
425 // eslint-disable-next-line camelcase
426 env.npm_config_https_proxy = 'http://priority';
427 testProxyUrl(env, 'http://priority', 'https://example');
428 });
429 // eslint-disable-next-line max-len
430 describe('npm_config_https_proxy should take precedence over HTTPS_PROXY and npm_config_proxy', function() {
431 var env = {};
432 // eslint-disable-next-line camelcase
433 env.npm_config_https_proxy = 'http://https-proxy';
434 // eslint-disable-next-line camelcase
435 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 camelcase
443 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 camelcase
448 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-len
453 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 camelcase
458 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 camelcase
466 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-len
472 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 camelcase
477 env.npm_config_no_proxy = 'example';
478
479 testProxyUrl(env, '', 'http://example');
480 testProxyUrl(env, 'http://proxy', 'http://otherwebsite');
481 });
482 });
483});
Note: See TracBrowser for help on using the repository browser.