download.js 976 B

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