--- /dev/null
+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
+ }
+}