【问题标题】:How can content-encoding be ignored如何忽略内容编码
【发布时间】:2015-03-31 18:42:41
【问题描述】:

我有一台设备需要从中下载文件。在某些情况下,该文件的content-encoding 可能不正确。特别是,当它没有被 gzip 压缩或以任何方式压缩时,它可能具有“gzip”的内容编码。

因此,当文件被 gzip 压缩时,使用基本的 ajax GET 获取内容很简单:

$.ajax({
    url: 'http://' + IP + '/test.txt',
    type: 'GET'
})
.done(function(data) {
    alert(data);
});

但正如您所料,当内容编码错误时,这会失败。

需要明确的是,我不是在寻找解决方案来绕过ERR_CONTENT_DECODING_FAILED,而只是在浏览器中导航到给定的网址。例如,我希望能够将 csv 加载到 javascript 中的字符串中以进行进一步解析。

我可以获取文件,并强制它跳过尝试解码,或覆盖响应的内容编码,或类似的吗?

【问题讨论】:

  • 我建议尝试从 Accept-Encoding 标头中删除 gzip,但由于某种原因,浏览器似乎不允许您这样做。我唯一能想到的是一个代理,你有一些服务器代码发出请求,这应该让你在如何构建请求和处理响应方面有更大的灵活性。
  • Accept-Encoding 的合理想法,但已经尝试过,并确认它会总是 发回 Content-Encoding: gzip,无论如何。
  • 我唯一的其他想法就是对负责发送错误响应标头的人大喊大叫(或为他们购买 cookie),并让他们修复它。
  • 总是可以创建一个服务器端解决方案来处理抓取文本并返回它。
  • 在这里使用 try-catch 是否过于简单?我认为这会起作用,并且可以捕获编码不正确时的预期错误。

标签: javascript ajax content-encoding


【解决方案1】:

根据 WHATWG 的 XHR spec,这根本不可能通过客户端 JavaScript 完成,它利用了来自 WHATWG Fetch Standardfetch 操作。

客户端脚本只能读取浏览器环境提供的响应对象。 Fetch Standard 定义了浏览器环境必须如何在 fetch 操作的步骤 2 中构建响应对象的 body 属性(特别注意子步骤 2 到 4):

  1. 每当传输一个或多个字节时,让 bytes 为传输的字节并运行这些子子步骤:

    1. 字节的长度增加响应的主体传输。

    2. codings 成为在响应的标头列表中解析 Content-Encoding 的结果。

    3. bytes 设置为处理给定 codingsbytes 的内容编码的结果。

    4. bytes 推送到响应正文。

处理内容编码的动作在哪里:

处理给定编码字节的内容编码,请运行以下子步骤:

  1. 如果不支持编码,则返回 bytes

  2. 使用给定的编码返回解码字节的结果,如HTTP中所述。

从这个定义中,我们可以看到响应对象永远不会在其 body 属性中公开编码字节。在将字节添加到正文之前,必须先对它们进行解码。客户端脚本从不可以访问规范所称的“传输字节”(即通过网络发送的实际编码字节)。

解码完全由Content-Encoding 标头确定。客户端 JavaScript 没有机制可以操作响应对象的响应标头,因此 Content-Encoding 必须是服务器最初发送的任何内容。

您的服务器正在执行的操作是错误的。您唯一的选择是:

  1. 修复服务器的行为。

  2. 通过代理运行 HTTP 响应,该代理在到达您的客户端之前修复 Content-Encoding 响应标头。

【讨论】:

    【解决方案2】:

    在基于浏览器的现代环境中,由于 HttpRequest 的同源策略,您无法更改 Accept-Encoding:

    Link to Google's explanation

    对于您的脑残设备,最好的解决方法是使用服务器端代理来获取内容并忽略不正确的编码,然后返回带有一组合理标头的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-16
      • 2012-10-06
      • 2022-06-15
      • 2015-05-28
      • 1970-01-01
      相关资源
      最近更新 更多