diff --git a/cli/lib/tasks/download.js b/cli/lib/tasks/download.js index c21d311c2f..9fd55cf21d 100644 --- a/cli/lib/tasks/download.js +++ b/cli/lib/tasks/download.js @@ -9,6 +9,7 @@ const request = require('@cypress/request') const Promise = require('bluebird') const requestProgress = require('request-progress') const { stripIndent } = require('common-tags') +const getProxyForUrl = require('proxy-from-env').getProxyForUrl const { throwFormErrorText, errors } = require('../errors') const fs = require('../fs') @@ -16,12 +17,9 @@ const util = require('../util') const defaultBaseUrl = 'https://download.cypress.io/' -const getProxyUrl = () => { - return process.env.HTTPS_PROXY || - process.env.https_proxy || +const getProxyForUrlWithNpmConfig = (url) => { + return getProxyForUrl(url) || process.env.npm_config_https_proxy || - process.env.HTTP_PROXY || - process.env.http_proxy || process.env.npm_config_proxy || null } @@ -205,7 +203,7 @@ const verifyDownloadedFile = (filename, expectedSize, expectedChecksum) => { // {filename: ..., downloaded: true} const downloadFromUrl = ({ url, downloadDestination, progress, ca }) => { return new Promise((resolve, reject) => { - const proxy = getProxyUrl() + const proxy = getProxyForUrlWithNpmConfig(url) debug('Downloading package', { url, @@ -357,6 +355,6 @@ const start = (opts) => { module.exports = { start, getUrl, - getProxyUrl, + getProxyForUrlWithNpmConfig, getCA, } diff --git a/cli/package.json b/cli/package.json index 59cba0b43c..e63e144e9d 100644 --- a/cli/package.json +++ b/cli/package.json @@ -54,6 +54,7 @@ "minimist": "^1.2.5", "ospath": "^1.2.2", "pretty-bytes": "^5.6.0", + "proxy-from-env": "1.0.0", "ramda": "~0.27.1", "request-progress": "^3.0.0", "supports-color": "^8.1.1", diff --git a/cli/test/lib/tasks/download_spec.js b/cli/test/lib/tasks/download_spec.js index fe5a4ebce3..02d1c9aac0 100644 --- a/cli/test/lib/tasks/download_spec.js +++ b/cli/test/lib/tasks/download_spec.js @@ -313,28 +313,60 @@ describe('lib/tasks/download', function () { }) context('with proxy env vars', () => { + const testUriHttp = 'http://anything.com' + const testUriHttps = 'https://anything.com' + beforeEach(function () { this.env = _.clone(process.env) + // add a default no_proxy which does not match the testUri + process.env.NO_PROXY = 'localhost,.org' }) afterEach(function () { process.env = this.env }) - it('prefers https_proxy over http_proxy', () => { - process.env.HTTP_PROXY = 'foo' - expect(download.getProxyUrl()).to.eq('foo') - process.env.https_proxy = 'bar' - expect(download.getProxyUrl()).to.eq('bar') + it('uses http_proxy on http request', () => { + process.env.http_proxy = 'http://foo' + expect(download.getProxyForUrlWithNpmConfig(testUriHttp)).to.eq('http://foo') + }) + + it('ignores http_proxy on https request', () => { + process.env.http_proxy = 'http://foo' + expect(download.getProxyForUrlWithNpmConfig(testUriHttps)).to.eq(null) + process.env.https_proxy = 'https://bar' + expect(download.getProxyForUrlWithNpmConfig(testUriHttps)).to.eq('https://bar') }) it('falls back to npm_config_proxy', () => { - process.env.npm_config_proxy = 'foo' - expect(download.getProxyUrl()).to.eq('foo') - process.env.npm_config_https_proxy = 'bar' - expect(download.getProxyUrl()).to.eq('bar') - process.env.https_proxy = 'baz' - expect(download.getProxyUrl()).to.eq('baz') + process.env.npm_config_proxy = 'http://foo' + expect(download.getProxyForUrlWithNpmConfig(testUriHttps)).to.eq('http://foo') + process.env.npm_config_https_proxy = 'https://bar' + expect(download.getProxyForUrlWithNpmConfig(testUriHttps)).to.eq('https://bar') + process.env.https_proxy = 'https://baz' + expect(download.getProxyForUrlWithNpmConfig(testUriHttps)).to.eq('https://baz') + }) + + it('respects no_proxy on http and https requests', () => { + process.env.NO_PROXY = 'localhost,.com' + + process.env.http_proxy = 'http://foo' + process.env.https_proxy = 'https://bar' + + expect(download.getProxyForUrlWithNpmConfig(testUriHttp)).to.eq(null) + expect(download.getProxyForUrlWithNpmConfig(testUriHttps)).to.eq(null) + }) + + it('ignores no_proxy for npm proxy configs, prefers https over http', () => { + process.env.NO_PROXY = 'localhost,.com' + + process.env.npm_config_proxy = 'http://foo' + expect(download.getProxyForUrlWithNpmConfig(testUriHttp)).to.eq('http://foo') + expect(download.getProxyForUrlWithNpmConfig(testUriHttps)).to.eq('http://foo') + + process.env.npm_config_https_proxy = 'https://bar' + expect(download.getProxyForUrlWithNpmConfig(testUriHttp)).to.eq('https://bar') + expect(download.getProxyForUrlWithNpmConfig(testUriHttps)).to.eq('https://bar') }) }) diff --git a/yarn.lock b/yarn.lock index 9bc44212b8..48c063cfd5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3456,7 +3456,7 @@ "@types/istanbul-reports" "^1.1.1" "@types/yargs" "^13.0.0" -"@jest/types@^26.3.0", "@jest/types@^26.6.2": +"@jest/types@^26.6.2": version "26.6.2" resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== @@ -7657,7 +7657,7 @@ dependencies: chalk "*" -"@types/cheerio@*", "@types/cheerio@0.22.21": +"@types/cheerio@*": version "0.22.21" resolved "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.21.tgz#5e37887de309ba11b2e19a6e14cad7874b31a8a3" integrity sha512-aGI3DfswwqgKPiEOTaiHV2ZPC9KEhprpgEbJnv0fZl3SGX0cGgEva1126dGrMC6AJM6v/aihlUgJn9M5DbDZ/Q== @@ -7752,7 +7752,7 @@ dependencies: "@types/enzyme" "*" -"@types/enzyme@*", "@types/enzyme@3.10.5": +"@types/enzyme@*": version "3.10.5" resolved "https://registry.yarnpkg.com/@types/enzyme/-/enzyme-3.10.5.tgz#fe7eeba3550369eed20e7fb565bfb74eec44f1f0" integrity sha512-R+phe509UuUYy9Tk0YlSbipRpfVtIzb/9BHn5pTEtjJTF5LXvUjrIQcZvNyANNEyFrd2YGs196PniNT1fgvOQA== @@ -10160,7 +10160,7 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= -ansi-regex@^4.1.0: +ansi-regex@^4.0.0, ansi-regex@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== @@ -14469,6 +14469,11 @@ component-bind@1.0.0: resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= +component-emitter@1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= + component-emitter@^1.2.0, component-emitter@^1.2.1, component-emitter@^1.3.0, component-emitter@~1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" @@ -31563,15 +31568,25 @@ pretty-error@^2.0.2, pretty-error@^2.1.1: lodash "^4.17.20" renderkid "^2.0.4" -pretty-format@26.4.0, pretty-format@^24.9.0, pretty-format@^26.6.2: - version "26.4.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.4.0.tgz#c08073f531429e9e5024049446f42ecc9f933a3b" - integrity sha512-mEEwwpCseqrUtuMbrJG4b824877pM5xald3AkilJ47Po2YLr97/siejYQHqj2oDQBeJNbu+Q0qUuekJ8F0NAPg== +pretty-format@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" + integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== dependencies: - "@jest/types" "^26.3.0" + "@jest/types" "^24.9.0" + ansi-regex "^4.0.0" + ansi-styles "^3.2.0" + react-is "^16.8.4" + +pretty-format@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" + integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== + dependencies: + "@jest/types" "^26.6.2" ansi-regex "^5.0.0" ansi-styles "^4.0.0" - react-is "^16.12.0" + react-is "^17.0.1" pretty-hrtime@^1.0.0, pretty-hrtime@^1.0.3: version "1.0.3" @@ -32715,12 +32730,12 @@ react-inspector@^5.1.0: is-dom "^1.0.0" prop-types "^15.0.0" -react-is@16.13.1, react-is@^16.12.0, react-is@^16.13.1, react-is@^16.3.2, react-is@^16.7.0, react-is@^16.8.0, react-is@^16.8.1, react-is@^16.8.6: +react-is@16.13.1, react-is@^16.12.0, react-is@^16.13.1, react-is@^16.3.2, react-is@^16.7.0, react-is@^16.8.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -"react-is@^16.8.0 || ^17.0.0", react-is@^17.0.2: +"react-is@^16.8.0 || ^17.0.0", react-is@^17.0.1, react-is@^17.0.2: version "17.0.2" resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== @@ -35735,7 +35750,25 @@ socket.io-client@4.0.1: parseuri "0.0.6" socket.io-parser "~4.0.4" -socket.io-parser@4.0.4, socket.io-parser@~3.3.0, socket.io-parser@~3.4.0, socket.io-parser@~4.0.3, socket.io-parser@~4.0.4: +socket.io-parser@~3.3.0: + version "3.3.2" + resolved "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz#ef872009d0adcf704f2fbe830191a14752ad50b6" + integrity sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg== + dependencies: + component-emitter "~1.3.0" + debug "~3.1.0" + isarray "2.0.1" + +socket.io-parser@~3.4.0: + version "3.4.1" + resolved "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz#b06af838302975837eab2dc980037da24054d64a" + integrity sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A== + dependencies: + component-emitter "1.2.1" + debug "~4.1.0" + isarray "2.0.1" + +socket.io-parser@~4.0.3, socket.io-parser@~4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.0.4.tgz#9ea21b0d61508d18196ef04a2c6b9ab630f4c2b0" integrity sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g== @@ -39795,7 +39828,7 @@ vue-style-loader@^4.1.0, vue-style-loader@^4.1.2: hash-sum "^1.0.2" loader-utils "^1.0.2" -vue-template-compiler@2.6.12, vue-template-compiler@^2.6.11: +vue-template-compiler@^2.6.11: version "2.6.12" resolved "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.12.tgz#947ed7196744c8a5285ebe1233fe960437fcc57e" integrity sha512-OzzZ52zS41YUbkCBfdXShQTe69j1gQDZ9HIX8miuC9C3rBCk9wIRjLiZZLrmX9V+Ftq/YEyv1JaVr5Y/hNtByg==