1const fetch = require('make-fetch-happen') 2const { promises: fs } = require('graceful-fs') 3const log = require('./log') 4 5async function download (gyp, url) { 6 log.http('GET', url) 7 8 const requestOpts = { 9 headers: { 10 'User-Agent': `node-gyp v${gyp.version} (node ${process.version})`, 11 Connection: 'keep-alive' 12 }, 13 proxy: gyp.opts.proxy, 14 noProxy: gyp.opts.noproxy 15 } 16 17 const cafile = gyp.opts.cafile 18 if (cafile) { 19 requestOpts.ca = await readCAFile(cafile) 20 } 21 22 const res = await fetch(url, requestOpts) 23 log.http(res.status, res.url) 24 25 return res 26} 27 28async function readCAFile (filename) { 29 // The CA file can contain multiple certificates so split on certificate 30 // boundaries. [\S\s]*? is used to match everything including newlines. 31 const ca = await fs.readFile(filename, 'utf8') 32 const re = /(-----BEGIN CERTIFICATE-----[\S\s]*?-----END CERTIFICATE-----)/g 33 return ca.match(re) 34} 35 36module.exports = { 37 download, 38 readCAFile 39} 40