防止Firefox在请求中绕过磁盘缓存(如何通过网络禁用“种族缓存”?

问题描述 投票:0回答:1

自版本59起,Firefox具有称为带网络竞赛缓存(RCWN)的功能。如果Firefox检测到磁盘速度慢,则可以决定立即启动网络请求,而无需等待缓存。这是一个折衷:如果网络请求赢得竞争,则延迟会得到改善;如果缓存赢了,则网络带宽已被浪费。

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

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

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

关于RCWN的文档很少,希望这些XMLHttpRequest,但是我在network.http.rcwn.enabled中找到了它的实现:

slides

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

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


注意:要获取更多信息,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(); } } ... } 进行RCWN的自检,并通过Cache-Control: only-if-cached进行缓存的自检。如果您检查RCWN,即使您拥有SSD,竞赛也不会太罕见。在网络监视器中,争用的请求将在已传送的列中进行标记,例如,标记为Cache-Control: only-if-cached

firefox caching fetch firefox-webextensions
1个回答
1
投票

由于WebAssembly。{compileStreaming,instantiateStreaming}都采用Response,所以我们有一个指向原始缓存条目的链接,因此我们可以使用alt-data API(当前由JS字节码缓存使用)来缓存机器代码。后来通过wasm-esm集成(about:networking#rcwn),我们可以另外通过nsScriptLoader插入。

这是为了包含最近从wasm规范中删除的显式IDB缓存(错误1469395),并击败了我们在dom / asmjscache中执行的隐式asm.js缓存。核心(反)序列化机制仍然存在(并且被asm.js缓存积极使用)。

将在其上建立的现有wasm流式支持是FetchUtil :: StreamResponseToJS:about:cache我们需要使用的alt-data接口是nsICacheInfoChannel,它使我们能够获得序列化模块的流。

看来我们需要对alt-data API进行一些适度的更改:bug1487100。同时,我们可以通过在fetch()中无条件设置首选的alt-data-type“ wasm”来进行某种排序工作。 。

当为DOM Cache API实现替代数据(错误1336199)时,这种相同的支持应该只适用于DOM Cache / ServiceWorker,这也许可以提供对更大配额和更低流失率的访问。

© www.soinside.com 2019 - 2024. All rights reserved.