Support for setting and restoring proxy related env variables

This commit is contained in:
John Andersen
2015-09-11 08:07:28 -07:00
committed by Adam Stankiewicz
parent af9b386d8a
commit 4e3e45a88b
6 changed files with 113 additions and 5 deletions

View File

@@ -30,7 +30,6 @@
"quotmark": "single",
"strict": false,
"trailing": true,
"camelcase": true,
"asi": false,
"boss": true,

View File

@@ -3,18 +3,26 @@ var object = require('mout/object');
var rc = require('./util/rc');
var defaults = require('./util/defaults');
var expand = require('./util/expand');
var EnvProxy = require('./util/proxy');
var path = require('path');
var fs = require('fs');
function Config(cwd) {
this._cwd = cwd || process.cwd();
this._proxy = new EnvProxy();
this._config = {};
}
Config.prototype.load = function () {
this._config = rc('bower', defaults, this._cwd);
this._proxy.set(this._config);
return this;
};
Config.prototype.restore = function () {
this._proxy.restore();
};
/* jshint ignore:start */
Config.prototype.get = function (key) {
// TODO

View File

@@ -2,7 +2,6 @@ var path = require('path');
var paths = require('./paths');
// Guess proxy defined in the env
/*jshint camelcase: false*/
var proxy = process.env.HTTP_PROXY
|| process.env.http_proxy
|| null;
@@ -10,7 +9,9 @@ var proxy = process.env.HTTP_PROXY
var httpsProxy = process.env.HTTPS_PROXY
|| process.env.https_proxy
|| proxy;
/*jshint camelcase: true*/
var noProxy = process.env.NO_PROXY
|| process.env.no_proxy;
// Use a well known user agent (in this case, curl) when using a proxy,
// to avoid potential filtering on many corporate proxies with blank or unknown agents
@@ -26,6 +27,7 @@ var defaults = {
'tmp': paths.tmp,
'proxy': proxy,
'https-proxy': httpsProxy,
'no-proxy': noProxy,
'timeout': 30000,
'ca': { search: [] },
'strict-ssl': true,

View File

@@ -0,0 +1,52 @@
// EnvProxy uses the proxy vaiables passed to it in set and sets the
// process.env uppercase proxy variables to them with the ability
// to restore the original values later
var EnvProxy = function() {
this.restoreFrom = {};
};
EnvProxy.prototype.set = function (config) {
this.config = config;
// Override environment defaults if proxy config options are set
// This will make requests.js follow the proxies in config
if (Object.prototype.hasOwnProperty.call(config, 'no-proxy')) {
this.restoreFrom.NO_PROXY = process.env.NO_PROXY;
this.restoreFrom.no_proxy = process.env.no_proxy;
process.env.NO_PROXY = config['no-proxy'];
delete process.env.no_proxy;
}
if (Object.prototype.hasOwnProperty.call(config, 'proxy')) {
this.restoreFrom.HTTP_PROXY = process.env.HTTP_PROXY;
this.restoreFrom.http_proxy = process.env.http_proxy;
process.env.HTTP_PROXY = config.proxy;
delete process.env.http_proxy;
}
if (Object.prototype.hasOwnProperty.call(config, 'https-proxy')) {
this.restoreFrom.HTTPS_PROXY = process.env.HTTPS_PROXY;
this.restoreFrom.https_proxy = process.env.https_proxy;
process.env.HTTPS_PROXY = config['https-proxy'];
delete process.env.https_proxy;
}
};
EnvProxy.prototype.restore = function () {
if (Object.prototype.hasOwnProperty.call(this.config, 'no-proxy')) {
process.env.NO_PROXY = this.restoreFrom.NO_PROXY;
process.env.no_proxy = this.restoreFrom.no_proxy;
}
if (Object.prototype.hasOwnProperty.call(this.config, 'proxy')) {
process.env.HTTP_PROXY = this.restoreFrom.HTTP_PROXY;
process.env.http_proxy = this.restoreFrom.http_proxy;
}
if (Object.prototype.hasOwnProperty.call(this.config, 'https-proxy')) {
process.env.HTTPS_PROXY = this.restoreFrom.HTTPS_PROXY;
process.env.https_proxy = this.restoreFrom.https_proxy;
}
};
module.exports = EnvProxy;

View File

@@ -0,0 +1,5 @@
{
"proxy": "http://HTTP_PROXY",
"https-proxy": "http://HTTPS_PROXY",
"no-proxy": "google.com"
}

View File

@@ -15,11 +15,10 @@ describe('NPM Config on package.json', function () {
}
describe('Setting process.env.npm_package_config', function () {
/*jshint camelcase:false*/
process.env.npm_package_config_bower_directory = 'npm-path';
process.env.npm_package_config_bower_colors = false;
var config = require('../lib/Config').create().load()._config;
var config = require('../lib/Config').read();
it('should return "npm-path" for "bower_directory"', function () {
assert.equal('npm-path', config.directory);
@@ -61,6 +60,49 @@ describe('NPM Config on package.json', function () {
});
});
});
describe('setting ENV variables', function () {
beforeEach(function () {
delete process.env.no_proxy;
delete process.env.http_proxy;
delete process.env.https_proxy;
delete process.env.NO_PROXY;
delete process.env.HTTP_PROXY;
delete process.env.HTTPS_PROXY;
});
it('sets env variables', function () {
require('../lib/Config').read('test/assets/env-variables');
assert.equal(process.env.HTTP_PROXY, 'http://HTTP_PROXY');
assert.equal(process.env.HTTPS_PROXY, 'http://HTTPS_PROXY');
assert.equal(process.env.NO_PROXY, 'google.com');
assert.equal(process.env.http_proxy, undefined);
assert.equal(process.env.https_proxy, undefined);
assert.equal(process.env.no_proxy, undefined);
});
it('restores env variables', function () {
process.env.HTTP_PROXY = 'a';
process.env.HTTPS_PROXY = 'b';
process.env.NO_PROXY = 'c';
process.env.http_proxy = 'd';
process.env.https_proxy = 'e';
process.env.no_proxy = 'f';
var config = require('../lib/Config').create('test/assets/env-variables').load();
config.restore();
assert.equal(process.env.HTTP_PROXY, 'a');
assert.equal(process.env.HTTPS_PROXY, 'b');
assert.equal(process.env.NO_PROXY, 'c');
assert.equal(process.env.http_proxy, 'd');
assert.equal(process.env.https_proxy, 'e');
assert.equal(process.env.no_proxy, 'f');
});
});
});
require('./util/index');