在某些浏览器中发出范围请求
Issue making range requests in some browsers
摘要:我想从 GitHub 页面发出范围 header 请求。然而,在某些浏览器中这是失败的——可能是由于 Gzip 压缩问题。它在 Chrome (v74) 中有效,但在 FF (v66) 中无效,Mac OS.
目标:我想在所有浏览器中可靠地发出此请求,例如在发出范围请求时强制将响应类型编码为文本。
我不清楚这种行为是由浏览器、服务器还是两者的某种组合决定的。了解来源可能有助于定义修复 - 使用 Github 页面会很好但不是强制性的。
我也不清楚这是否代表一个错误,或者如果是的话,在哪里。 (在浏览器、规范等中)
示例测试用例:
可能因为这涉及 server-side 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 中,它给出了 "decoding error".
如果我省略 resp.text
,Firefox 可以完成请求 - 解码错误是在读取 body,而不是任何其他代码。复制为 curl 显示 FF 添加了一个 --compress
标志,而 Chrome 没有。
调查
如果字节范围为 0-100,则请求在 FF 中工作。如果范围是 1-100,则失败。文件的这一部分全部是 ASCII 字符。
如果我检查响应 headers (Array.from(r.headers.entries())
),我认为 FF 有一个额外的 "content-encoding: gz flag" 导致了问题。
(例如,如果没有秘密解码器指令,gzip 就没有意义)
我尝试将'accept-encoding': 'identity'
添加到获取请求中,但它是一个forbidden header并且通过代码修改它没有效果。
这里的规格最近发生了变化。 Here is the link to the PR.
TLDR; They now ask将Acccept-Encoding/Identity
header添加到所有Range-requests的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
是 decode-able火狐)。
摘要:我想从 GitHub 页面发出范围 header 请求。然而,在某些浏览器中这是失败的——可能是由于 Gzip 压缩问题。它在 Chrome (v74) 中有效,但在 FF (v66) 中无效,Mac OS.
目标:我想在所有浏览器中可靠地发出此请求,例如在发出范围请求时强制将响应类型编码为文本。
我不清楚这种行为是由浏览器、服务器还是两者的某种组合决定的。了解来源可能有助于定义修复 - 使用 Github 页面会很好但不是强制性的。
我也不清楚这是否代表一个错误,或者如果是的话,在哪里。 (在浏览器、规范等中)
示例测试用例:
可能因为这涉及 server-side 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 中,它给出了 "decoding error".
如果我省略 resp.text
,Firefox 可以完成请求 - 解码错误是在读取 body,而不是任何其他代码。复制为 curl 显示 FF 添加了一个 --compress
标志,而 Chrome 没有。
调查 如果字节范围为 0-100,则请求在 FF 中工作。如果范围是 1-100,则失败。文件的这一部分全部是 ASCII 字符。
如果我检查响应 headers (Array.from(r.headers.entries())
),我认为 FF 有一个额外的 "content-encoding: gz flag" 导致了问题。
(例如,如果没有秘密解码器指令,gzip 就没有意义)
我尝试将'accept-encoding': 'identity'
添加到获取请求中,但它是一个forbidden header并且通过代码修改它没有效果。
这里的规格最近发生了变化。 Here is the link to the PR.
TLDR; They now ask将Acccept-Encoding/Identity
header添加到所有Range-requests的UA。
[§5.15]
If httpRequest’s header list contains
Range
, then appendAccept-Encoding
/identity
to httpRequest’s header list.
这里Firefox还没有跟进,但是a bug report has been filled。
目前,Firefox 中的范围请求确实是使用 Gzipped 数据进行的,因此,您不能破坏字节完整性(例如范围 0-100
是 decode-able火狐)。