早期提示¶
早期提示 是一种信息性 HTTP 状态码,允许服务器在发送最终响应之前发送可能出现在最终响应中的标头。这用于发送 Link 标头 以启动 preconnect
和 preload
。
本文档介绍了 Firefox 中早期提示的实现细节。我们重点关注 preload
功能,因为它是与类交互的主要功能。对于早期提示 preconnect
,早期提示的特定代码相当小,并且仅触及 103 Early Hints
响应 上的代码路径。
早期提示的优势源于利用服务器思考时间。响应 (2) 和 (3) 到达之间的时间是早期提示可以获得的理论最大收益。服务器思考时间可能源于通过与数据库交互创建动态内容,或者更常见的情况是将请求代理到不同的服务器。
103 Early Hints
主文档加载时的响应¶
在 103 Early Hints
响应中,处理主文档加载的 nsHttpChannel
将来自 103 Early Hints
响应的 Link 标头和一些其他标头传递给 EarlyHintsService
收到 103 Early Hints
响应时,nsHttpChannel
将 103 Early Hints
响应中的 Link
标头转发到 EarlyHintsService
。当 DocumentLoadListener
收到跨域重定向时,它会取消所有正在进行的预加载。
注意
仅处理第一个 103 Early Hints
响应。即使在同源重定向之后,其余的 103 Early Hints
响应也会被忽略。当我们收到跨域重定向时,所有正在进行的早期提示预加载请求都会被取消。
主文档最终响应¶
在最终响应中,DocumentLoadListener
从 EarlyHintsService
中检索 Link 标头列表。作为副作用,EarlyHintPreloader
还会启动一个 10 秒的计时器,如果内容进程未连接到 EarlyHintPreloader
,则会取消自身。在正常情况下,超时不应该发生,因为内容进程会立即连接到该 EarlyHintPreloader
。目前,只有在以下情况下才会发生超时
主要响应具有不同的 CSP 要求,不允许加载(Bug 1815884),
主要响应具有 COEP 标头,不允许加载(Bug 1806403),
用户重新加载网站,并且图像/css 已存在于图像/css 缓存中(Bug 1815884),
在连接发生之前或其他一些极端情况下,标签被关闭。
内容进程发起的预加载请求¶
子进程首先解析 103 Early Hints
响应中的 Link 标头,然后解析主文档响应中的 Link 标头。来自 103 Early Hints
响应的 Link 标头的预加载具有分配给它们的 earlyHintPreloadId
。在调用 AsyncOpen
之前,预加载器会将此 earlyHintPreloaderId
设置在执行预加载的通道上。HttpChannelParent
在 AsyncOpen
中查找 earlyHintPreloaderId
,并通过 EarlyHintRegistrar
连接到 EarlyHintPreloader
,而不是发出网络请求。
早期提示预加载请求¶
EarlyHintPreloader
遵循 HTTP 3xx 重定向,并始终设置请求标头 X-Moz: early hint
。
早期提示预加载响应¶
当 EarlyHintPreloader
收到 OnStartRequest
时,它会将所有 nsIRequestObserver
函数转发到 HttpChannelParent
,只要它知道要将 nsIRequestObserver
函数转发到哪个 HttpChannelParent
。
最终设置¶
最后,所有剩余的 OnDataAvailable
和 OnStopRequest
调用都通过此调用链从 nsIChannel
传递到预加载器。