| var crypto = require('crypto') |
| var HttpAgent = require('http').Agent |
| var HttpsAgent = require('https').Agent |
| |
| var pkg = require('../package.json') |
| |
| module.exports = initialize |
| |
| function initialize (uri, method, accept, headers) { |
| if (!this.config.sessionToken) { |
| this.config.sessionToken = crypto.randomBytes(8).toString('hex') |
| this.log.verbose('request id', this.config.sessionToken) |
| } |
| |
| var opts = { |
| url: uri, |
| method: method, |
| headers: headers, |
| localAddress: this.config.proxy.localAddress, |
| strictSSL: this.config.ssl.strict, |
| cert: this.config.ssl.certificate, |
| key: this.config.ssl.key, |
| ca: this.config.ssl.ca, |
| agent: getAgent.call(this, uri.protocol) |
| } |
| |
| // allow explicit disabling of proxy in environment via CLI |
| // |
| // how false gets here is the CLI's problem (it's gross) |
| if (this.config.proxy.http === false) { |
| opts.proxy = null |
| } else { |
| // request will not pay attention to the NOPROXY environment variable if a |
| // config value named proxy is passed in, even if it's set to null. |
| var proxy |
| if (uri.protocol === 'https:') { |
| proxy = this.config.proxy.https |
| } else { |
| proxy = this.config.proxy.http |
| } |
| if (typeof proxy === 'string') opts.proxy = proxy |
| } |
| |
| headers.version = this.version || pkg.version |
| headers.accept = accept |
| |
| if (this.refer) headers.referer = this.refer |
| |
| headers['npm-session'] = this.config.sessionToken |
| headers['user-agent'] = this.config.userAgent |
| |
| return opts |
| } |
| |
| function getAgent (protocol) { |
| if (protocol === 'https:') { |
| if (!this.httpsAgent) { |
| this.httpsAgent = new HttpsAgent({ |
| keepAlive: true, |
| maxSockets: this.config.maxSockets, |
| localAddress: this.config.proxy.localAddress, |
| rejectUnauthorized: this.config.ssl.strict, |
| ca: this.config.ssl.ca, |
| cert: this.config.ssl.certificate, |
| key: this.config.ssl.key |
| }) |
| } |
| |
| return this.httpsAgent |
| } else { |
| if (!this.httpAgent) { |
| this.httpAgent = new HttpAgent({ |
| keepAlive: true, |
| maxSockets: this.config.maxSockets, |
| localAddress: this.config.proxy.localAddress |
| }) |
| } |
| |
| return this.httpAgent |
| } |
| } |