https.Agent在Node中的作用是什么?

12
在 Node 的 https 模块文档中,关于 https.request,给出了一个示例:
const options = {
  hostname: 'encrypted.google.com',
  port: 443,
  path: '/',
  method: 'GET',
  key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
  cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem')
};
options.agent = new https.Agent(options);

const req = https.request(options, (res) => {
  // ...
});
我认为这个例子有点含糊不清,我已经在SO关于这种模棱两可的问题问了一个问题,并在根据评论确认了奇怪措辞后,开了一个问题

尽管如此,我仍在试图理解代理在这种情况下所扮演的角色,因为https.Agent模块确实接受TLS连接选项:

interface AgentOptions extends http.AgentOptions, tls.ConnectionOptions
https.Agent对象的定义是:用于HTTPS的类似于http.Agent的对象。http.Agent对象的定义是:代理负责为HTTP客户端管理连接持久性和重用性。从中可以理解到,代理负责管理连接并且https.Agent存在意味着它管理HTTPS连接,因此可以接收TLS配置选项。然而,这是否意味着代理在这种情况下还有额外的配置网络安全的责任呢?如果是这样的话,那么这个API就有些奇怪了。我本来期望在https.request上看到网络连接配置的单独键(就像在上面片段后显示的例子中一样)。为什么要过度使用同一个对象来承担另一个职责呢?实际上,为什么要有https.Agent呢?http.Agent应该控制连接池和保持连接存活,而另一层应该控制配置实际请求。对我来说,https.Agent对象似乎没有很好地定义。
1个回答

9
实际上,HTTPS doc提供了一些好的资源链接,其中包含一个指向HTTPS module source code的链接,该代码可以揭示很多信息。但是为了回答你的问题:

这是否意味着在这种情况下,代理Agent有配置请求的网络安全的额外责任?

是的,有点像,您的HTTPS代理可以执行自定义安全功能,甚至使用外部HTTPS实现,但对于内置的https.Agent,使用本地TLS模块,并且您传递给构造函数的选项最终传递给tls.connect,允许您配置自定义TLS选项。

为什么要为另一个职责重载同一对象?真的需要一个https.Agent吗?

因为HTTPS是基于TLS运行的。实际上,https.Agent在内部调用和构建http.Agent。额外的部分主要是使用SSL“会话”而不是TCP“套接字”,如果您搜索https.Agent中的getName源代码并将其与http.Agent的进行比较,您会发现SSL会话缓存基于更多字段,例如DHparams、客户端证书等,在HTTP中根本不存在这些东西。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接