mirror of https://github.com/lukechilds/node.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
1.8 KiB
63 lines
1.8 KiB
13 years ago
|
// get an http/https agent
|
||
|
// This is necessary for the custom CA certs in http2,
|
||
|
// especially while juggling multiple different registries.
|
||
|
//
|
||
|
// When using http2, the agent key is just the CA setting,
|
||
|
// since it can manage socket pooling across different host:port
|
||
|
// options. When using the older implementation, the
|
||
|
// key is ca:host:port combination.
|
||
|
|
||
|
module.exports = getAgent
|
||
|
|
||
|
var npm = require("../npm.js")
|
||
|
, url = require("url")
|
||
|
, agents = {}
|
||
|
, isHttp2 = !!require("http").globalAgent
|
||
|
, registry = url.parse(npm.config.get("registry"))
|
||
|
, regCA = npm.config.get("ca")
|
||
|
|
||
|
function getAgent (remote) {
|
||
|
// If not doing https, then there's no CA cert to manage.
|
||
|
// on http2, this will use the default global agent.
|
||
|
// on http1, this is undefined, so it'll spawn based on
|
||
|
// host:port if necessary.
|
||
|
if (remote.protocol !== "https:") {
|
||
|
return require("http").globalAgent
|
||
|
}
|
||
|
|
||
|
if (typeof remote === "string") {
|
||
|
remote = url.parse(remote)
|
||
|
}
|
||
|
|
||
|
var ca
|
||
|
// if this is the registry, then use the configuration ca.
|
||
|
// otherwise, just use the built-in CAs that node has.
|
||
|
// todo: multi-registry support.
|
||
|
if (remote.hostname === registry.hostname
|
||
|
&& remote.port === registry.port) {
|
||
|
ca = regCA
|
||
|
}
|
||
|
|
||
|
// no CA, just use the default agent.
|
||
|
if (!ca) {
|
||
|
return require("https").globalAgent
|
||
|
}
|
||
|
|
||
|
var hostname = remote.hostname
|
||
|
, port = remote.port
|
||
|
, key = agentKey(hostname, port, ca)
|
||
|
|
||
|
return agents[key] = agents[key] || getAgent_(hostname, port, ca)
|
||
|
}
|
||
|
|
||
|
function getAgent_ (hostname, port, ca) {
|
||
|
var Agent = require("https").Agent
|
||
|
return new Agent({ host: hostname
|
||
|
, port: port
|
||
|
, ca: ca })
|
||
|
}
|
||
|
|
||
|
function agentKey (hostname, port, ca) {
|
||
|
return JSON.stringify(isHttp2 ? ca : [hostname, port, ca])
|
||
|
}
|