javascript - 在某些浏览器中发出范围请求

标签 javascript google-chrome http firefox fetch-api

总结:我想从 GitHub 页面发出 Range header 请求。然而,在某些浏览器中这是失败的——可能是由于 Gzip 压缩问题。它适用于 Chrome (v74),但不适用于 FF (v66)、Mac OS。

目标:我想在所有浏览器中可靠地发出此请求,例如在发出范围请求时强制将响应类型编码为文本。

我不清楚这种行为是由浏览器、服务器还是两者的某种组合决定的。了解来源有助于定义修复 - 使用 Github 页面会很好,但不是强制性的。

我也不清楚这是否代表一个错误,或者如果是的话,在哪里。 (在浏览器、规范等中)

示例测试用例: 可能因为这涉及服务器端 gzip 编码,示例测试用例不会在本地重现。您需要在位于 https://abought.github.io/weetabix/ 的 JS 控制台中输入这些命令才能重现。

fetch('https://abought.github.io/weetabix/example_data/McDonald_s.csv', {headers: {range: 'bytes=1-100'}}).then(resp => resp.text());

在 chrome 中,这会获取响应文本。在 Firefox 中,它给出了“解码错误”。

如果我省略 resp.text,Firefox 可以完成请求 - 解码错误是在读取正文时出现的,而不是任何其他代码。复制为 curl 显示 FF 添加了一个 --compress 标志,而 Chrome 没有。

调查 如果字节范围为 0-100,则请求在 FF 中工作。如果范围是 1-100,则失败。文件的这一部分是所有 ASCII 字符。

如果我检查响应 header (Array.from(r.headers.entries())),FF 有一个额外的“内容编码:gz 标志”,我认为这是导致问题的原因. (例如,如果没有 secret 解码器指令,gzip 就没有意义)

我尝试将 'accept-encoding': 'identity' 添加到获取请求中,但它是一个 forbidden header并通过代码修改它没有效果。

最佳答案

这里的规范最近发生了变化。 Here is the link to the PR .

TLDR; They now askAccept-Encoding/Identity header 添加到所有范围请求的 UA。

[§5.15]

If httpRequest’s header list contains Range, then append Accept-Encoding/identity to httpRequest’s header list.

这里Firefox暂未跟进,但a bug report has been filled .

目前,Firefox 中的范围请求确实是使用 Gzipped 数据进行的,因此,您不能破坏字节完整性(例如范围 0-100 是可解码的在 Firefox 中)。

关于javascript - 在某些浏览器中发出范围请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55914486/

相关文章:

javascript - HTTP post 函数之后的重定向/样式设置

javascript - 构建 bash 命令时如何防止注入(inject)攻击?

javascript - 使用javascript和正则表达式删除图像srcs的左侧部分

javascript - 不使用 Math 返回数组中最小的数字

Javascript 休眠 x 秒

css - flexbox 中的图像高度在 Chrome 中不起作用

javascript - 同位素转换 'flash' 错误(Chrome)

javascript - 在jsfiddle中取消无限循环执行

c - 服务器 - 浏览器仅在服务器终止后显示站点

javascript - 自定义 http header 破坏 CORS