如何忽略内容编码
How can content-encoding be ignored
我有一个设备需要从中下载文件。在某些情况下,文件可能有不正确的 content-encoding
。特别是,当它没有被压缩或以任何方式压缩时,它可能具有 "gzip" 的内容编码。
因此,当文件被压缩后,使用基本的 ajax GET:
获取内容很简单
$.ajax({
url: 'http://' + IP + '/test.txt',
type: 'GET'
})
.done(function(data) {
alert(data);
});
但是正如您所料,当内容编码错误时,这会失败。
需要明确的是,我并不是在寻找一种解决方案来绕过 ERR_CONTENT_DECODING_FAILED
,而只是在浏览器中导航到给定的 url。例如,我希望能够将 csv 加载到 javascript 中的字符串中以供进一步解析。
我可以 GET 文件,并强制它跳过尝试解码,或覆盖响应的内容编码等吗?
在现代 browser-based 环境中,由于 HttpRequest 的 Same-Origin 政策,您无法更改 Accept-Encoding:
对于您的 brain-dead 设备,最好的解决方法是 server-side 代理获取内容并忽略不正确的编码,然后 returns 使用一组合理的 headers.
根据 WHATWG 的 XHR spec, which makes use of the fetch operation from the WHATWG Fetch Standard.
,通过 client-side JavaScript 根本不可能做到这一点
Client-side 脚本只能读取浏览器环境提供的响应 object。 Fetch 标准定义了浏览器环境必须如何在 fetch[=41= 的第 2 步中构建响应 object 的 body 属性] 操作(特别注意子步骤 2 到 4):
Whenever one or more bytes are transmitted, let bytes be the transmitted bytes and run these subsubsteps:
Increase response's body's transmitted with bytes' length.
Let codings be the result of parsing Content-Encoding
in response's header list.
Set bytes to the result of handling content codings given codings and bytes.
Push bytes to response's body.
其中操作 处理内容编码 是:
To handle content codings given codings and bytes, run these substeps:
If codings are not supported, return bytes.
Return the result of decoding bytes with the given codings as explained in HTTP.
从这个定义中,我们可以看到响应 object 从不在其 body 属性 中公开编码字节。在可以将字节添加到 body 之前,必须首先对它们进行解码。客户端脚本 never 可以访问规范所称的内容 "transmitted bytes"(即通过网络发送的实际编码字节)。
解码完全由Content-Encoding
header决定。 client-side JavaScript 无法操纵响应 object 的响应 header,因此 Content-Encoding
必须是服务器最初发送的内容。
你的服务器做错了。您唯一的选择是:
修复服务器的行为。
运行 通过代理修复 Content-Encoding
响应的 HTTP 响应 header 在它到达您的客户端之前。
我有一个设备需要从中下载文件。在某些情况下,文件可能有不正确的 content-encoding
。特别是,当它没有被压缩或以任何方式压缩时,它可能具有 "gzip" 的内容编码。
因此,当文件被压缩后,使用基本的 ajax GET:
获取内容很简单$.ajax({
url: 'http://' + IP + '/test.txt',
type: 'GET'
})
.done(function(data) {
alert(data);
});
但是正如您所料,当内容编码错误时,这会失败。
需要明确的是,我并不是在寻找一种解决方案来绕过 ERR_CONTENT_DECODING_FAILED
,而只是在浏览器中导航到给定的 url。例如,我希望能够将 csv 加载到 javascript 中的字符串中以供进一步解析。
我可以 GET 文件,并强制它跳过尝试解码,或覆盖响应的内容编码等吗?
在现代 browser-based 环境中,由于 HttpRequest 的 Same-Origin 政策,您无法更改 Accept-Encoding:
对于您的 brain-dead 设备,最好的解决方法是 server-side 代理获取内容并忽略不正确的编码,然后 returns 使用一组合理的 headers.
根据 WHATWG 的 XHR spec, which makes use of the fetch operation from the WHATWG Fetch Standard.
,通过 client-side JavaScript 根本不可能做到这一点Client-side 脚本只能读取浏览器环境提供的响应 object。 Fetch 标准定义了浏览器环境必须如何在 fetch[=41= 的第 2 步中构建响应 object 的 body 属性] 操作(特别注意子步骤 2 到 4):
Whenever one or more bytes are transmitted, let bytes be the transmitted bytes and run these subsubsteps:
Increase response's body's transmitted with bytes' length.
Let codings be the result of parsing
Content-Encoding
in response's header list.Set bytes to the result of handling content codings given codings and bytes.
Push bytes to response's body.
其中操作 处理内容编码 是:
To handle content codings given codings and bytes, run these substeps:
If codings are not supported, return bytes.
Return the result of decoding bytes with the given codings as explained in HTTP.
从这个定义中,我们可以看到响应 object 从不在其 body 属性 中公开编码字节。在可以将字节添加到 body 之前,必须首先对它们进行解码。客户端脚本 never 可以访问规范所称的内容 "transmitted bytes"(即通过网络发送的实际编码字节)。
解码完全由Content-Encoding
header决定。 client-side JavaScript 无法操纵响应 object 的响应 header,因此 Content-Encoding
必须是服务器最初发送的内容。
你的服务器做错了。您唯一的选择是:
修复服务器的行为。
运行 通过代理修复
Content-Encoding
响应的 HTTP 响应 header 在它到达您的客户端之前。