阻止 Firefox 在请求中绕过磁盘缓存(如何禁用“Race Cache With Network”)?

Phi*_*ßen 5 firefox caching fetch firefox-addon-webextensions

从版本 59 开始,Firefox 具有一项名为 Race Cache With Network (RCWN) 的功能。如果 Firefox 检测到磁盘速度较慢,它可以决定立即启动网络请求,而无需等待缓存。这是一个权衡:如果网络请求赢得比赛,延迟就会改善;如果缓存获胜,则网络带宽就被浪费了。

这是一项有用的功能,但有一种情况是不受欢迎的。假设WebExtension需要在后台更新资源(例如每小时一次)。延迟在这里并不重要,尽管适当的缓存至关重要,因为您需要为服务器端的传出流量付费。

我的问题是如何在请求级别禁用 RCWN。如何创建一个始终首先检查缓存然后才发出网络请求的请求(通过fetch或)。XMLHttpRequest换句话说,永远不要竞争,也永远不要绕过缓存。

我知道可以通过配置( )关闭该功能network.http.rcwn.enabled,但这不是解决方案。首先,您需要说服每个用户改变这种偏好。其次,RCWN 是一项有用的功能,它在延迟很重要的正常冲浪过程中提供了价值。强迫用户禁用它会导致浏览体验不佳。

关于 RCWN 的文档很少需要这些幻灯片,但我在Firefox 源代码中找到了它的实现:

nsresult nsHttpChannel::OpenCacheEntryInternal(...) {
  ...
  if (sRCWNEnabled && maybeRCWN && !mApplicationCacheForWrite) {
    bool hasAltData = false;
    uint32_t sizeInKb = 0;
    rv = cacheStorage->GetCacheIndexEntryAttrs(openURI, extension, &hasAltData,
                                               &sizeInKb);

    // We will attempt to race the network vs the cache if we've found
    // this entry in the cache index, and it has appropriate attributes
    // (doesn't have alt-data, and has a small size)
    if (NS_SUCCEEDED(rv) && !hasAltData &&
        sizeInKb < sRCWNSmallResourceSizeKB) {
      MaybeRaceCacheWithNetwork();
    }
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

我试图理解“替代数据”的概念,但找不到任何来源。据我所知,它代表替代数据。是否可以使用它(由服务器或通过客户端请求)强制将缓存数据标记为替代数据,这样就不会发生竞争?

我的另一个想法是:在获取请求中,客户端可以设置Cache-Control: only-if-cached,但这会改变语义。它应该停止比赛,但如果没有命中,它将返回陈旧的结果并且不会询问服务器。也许可以用来首先尝试这样的请求,然后才执行真正的网络请求。虽然不是很优雅。对于这个问题有更好的解决方案吗?


注意:为了获取更多信息,Firefox 允许通过 内省 RCWN about:networking#rcwn,并通过 内省缓存about:cache。如果你查看 RCWN,你会发现即使你有 SSD,比赛也并不少见。在网络监视器中,竞争请求将在已传输列中标记,例如,标记为100.86 KB (raced)