cloudflare - 访问 Cloudflare Workers 站点的压缩数据

标签 cloudflare cloudflare-workers

我的 cloudflare 工作人员站点包含 React 应用程序获取的二进制数据。该二进制数据以 gzip 压缩形式存储,因为它压缩得非常好(我们谈论的是 20-25 倍的缩减,未压缩它太大而无法满足 10MB KV 的限制)。我遇到的问题是工作人员返回没有适当 header 的数据:

Content-Encoding: gzip
或者,如果我让工作人员添加 header ,cloudflare 将对响应进行双重压缩。那么如何将 gzip 压缩数据存储在 cloudflare KV 中,以便我可以使用正确的内容编码返回它,而无需 cloudflare 对响应进行双重压缩?
引用
对于最小的复制:这是我正在使用的两个工作脚本。
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 });
}
上述工作脚本返回的二进制数据没有内容编码头,因此浏览器不会自动膨胀响应。
然后我尝试通过手动添加标题
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 };
  const resp = await getAssetFromKV(event, { mapRequestToAsset, cacheControl });
  resp.headers.set("Content-Encoding", "gzip");
  return resp;
}
响应具有正确的内容编码,但 cloudflare 压缩了响应,因此现在它在 gzip 中提供 gzip。
有什么办法可以找到一个中间地带,我可以使用正确的 header 从 cloudflare KV 中提供压缩数据,而无需双重压缩响应?

最佳答案

这是 Service Workers 规范的一个遗憾——它是为在浏览器中使用而设计的,它期望响应主体在工作线程运行之前被解压缩,并且不期望它们会再次通过网络传输。为了使事情保持一致,Cloudflare Workers 必须根据 content-encoding 重新压缩数据。传输时 header 。但这反过来意味着无法提供已经压缩的数据。
为了解决这个问题,我们 (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;

关于cloudflare - 访问 Cloudflare Workers 站点的压缩数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64836479/

相关文章:

javascript - 为什么在我的网站上多次加载样式表?

javascript - 从 Node child_process 执行 Argo Tunnel 时出现错误 1016

javascript - 如何与 Cloudflare 工作人员进行 A/B 测试

javascript - 访问 HTMLRewriter 中的嵌套元素 - Cloudflare Workers

ssl - CloudFlare 工作人员获取 HTTPS 适用于workers.dev 子域,但不适用于自己的子域,出现 525 错误

javascript - CloudFlare Workers - 检查 Cookie、添加 header 、设置 Cookie

php - 如何解决 Codeigniter 中的 Error 520 原始错误?

cloudflare - 使用 FaSTLy 或 Cloudflare 进行云运行

python - 在 python 上使用 cloudflare 保护连接到 websocket