Nic*_*ock 4 cloudflare cloudflare-workers
我的 cloudflare 工作人员站点包含 React 应用程序获取的二进制数据。该二进制数据以 gzip 压缩形式存储,因为它压缩得非常好(我们谈论的是 20-25 倍的压缩,未压缩时它太大,无法满足 10MB KV 限制)。我遇到的问题是工作人员返回的数据没有适当的标头:
Content-Encoding: gzip
Run Code Online (Sandbox Code Playgroud)
或者如果我让工作人员添加标头,cloudflare 将双重压缩响应。那么,如何在 cloudflare KV 中存储 gzip 压缩数据,以便我可以使用正确的内容编码返回它,而无需 cloudflare 双重压缩响应?
为了最小化复制:这是我正在使用的两个工作脚本。
Content-Encoding: gzip
Run Code Online (Sandbox Code Playgroud)
上面的工作脚本返回没有内容编码标头的二进制数据,因此浏览器不会自动膨胀响应。
所以然后我尝试通过手动添加标题
import { getAssetFromKV, mapRequestToAsset } from '@cloudflare/kv-asset-handler'
addEventListener('fetch', event => {
try {
event.respondWith(handleEvent(event))
} catch (e) {
event.respondWith(new Response('Internal Error', { status: 500 }))
}
})
async function handleEvent(event) {
const cacheControl = { browserTTL: 60 * 60 * 6 };
return await getAssetFromKV(event, { mapRequestToAsset, cacheControl });
}
Run Code Online (Sandbox Code Playgroud)
响应具有正确的内容编码,但 cloudflare 压缩了响应,因此现在它在 gzip 中提供 gzip。
有没有什么办法可以找到一个中间立场,让我可以从 cloudflare KV 中使用正确的标头提供压缩数据,而无需双重压缩响应?
这是 Service Workers 规范的一个不幸的缺陷——它是为在浏览器中使用而设计的,它期望响应主体在工作线程运行之前被解压缩,并且不期望它们再次通过网络传输。为了保持一致,Cloudflare Workers 在传输时必须根据标头重新压缩数据content-encoding。但这反过来意味着无法提供已经压缩的数据。
为了解决这个问题,我们(Cloudflare)添加了一个名为 的非标准Response选项encodeBody,它可以是"auto"(默认)或"manual"(假设主体已经被压缩)。
所以你可以写这样的代码:
let resp = await getAssetFromKV(event, { mapRequestToAsset, cacheControl });
// Make a new response with the same body but using manual encoding.
resp = new Response(resp.body, {
status: resp.status,
headers: resp.headers,
encodeBody: "manual"
});
// Modify headers and return.
resp.headers.set("Content-Encoding", "gzip");
return resp;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
995 次 |
| 最近记录: |