From 4e3e45a88bb5bc4b9ac4ba7f34233bf29dcc4f35 Mon Sep 17 00:00:00 2001 From: John Andersen Date: Fri, 11 Sep 2015 08:07:28 -0700 Subject: [PATCH] Support for setting and restoring proxy related env variables --- packages/bower-config/.jshintrc | 1 - packages/bower-config/lib/Config.js | 8 +++ packages/bower-config/lib/util/defaults.js | 6 ++- packages/bower-config/lib/util/proxy.js | 52 +++++++++++++++++++ .../test/assets/env-variables/.bowerrc | 5 ++ packages/bower-config/test/test.js | 46 +++++++++++++++- 6 files changed, 113 insertions(+), 5 deletions(-) create mode 100644 packages/bower-config/lib/util/proxy.js create mode 100644 packages/bower-config/test/assets/env-variables/.bowerrc diff --git a/packages/bower-config/.jshintrc b/packages/bower-config/.jshintrc index eae6f9cf..52c60909 100644 --- a/packages/bower-config/.jshintrc +++ b/packages/bower-config/.jshintrc @@ -30,7 +30,6 @@ "quotmark": "single", "strict": false, "trailing": true, - "camelcase": true, "asi": false, "boss": true, diff --git a/packages/bower-config/lib/Config.js b/packages/bower-config/lib/Config.js index 4ef370d8..00db28d2 100644 --- a/packages/bower-config/lib/Config.js +++ b/packages/bower-config/lib/Config.js @@ -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 diff --git a/packages/bower-config/lib/util/defaults.js b/packages/bower-config/lib/util/defaults.js index c742cbd0..e982d163 100644 --- a/packages/bower-config/lib/util/defaults.js +++ b/packages/bower-config/lib/util/defaults.js @@ -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, diff --git a/packages/bower-config/lib/util/proxy.js b/packages/bower-config/lib/util/proxy.js new file mode 100644 index 00000000..fc461c08 --- /dev/null +++ b/packages/bower-config/lib/util/proxy.js @@ -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; diff --git a/packages/bower-config/test/assets/env-variables/.bowerrc b/packages/bower-config/test/assets/env-variables/.bowerrc new file mode 100644 index 00000000..44148200 --- /dev/null +++ b/packages/bower-config/test/assets/env-variables/.bowerrc @@ -0,0 +1,5 @@ +{ + "proxy": "http://HTTP_PROXY", + "https-proxy": "http://HTTPS_PROXY", + "no-proxy": "google.com" +} diff --git a/packages/bower-config/test/test.js b/packages/bower-config/test/test.js index 08a3066e..3e504549 100644 --- a/packages/bower-config/test/test.js +++ b/packages/bower-config/test/test.js @@ -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');