首页 > 解决方案 > 从通过 webRequest FilterResponseData StreamFilter 传递的 TypedArray 缓存数据中解码字符串

问题描述

我正在使用 Mozilla 的 webRequest StreamFilter 来读取 http 请求

https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/filterResponseData

https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/StreamFilter/ondata

只要请求没有在浏览器中缓存,从类型化数组中解码的文本就可以正确解码,但是当数据来自缓存时就会出现问题。发生这种情况时,这将成为先前成功解码的相同数据的输出:

����������20180901034956%���������������������������������������� ���������� ����~��������v�a�r

这只是一个小样本,字符串相当大。为此,我使用TextDecoder并设置了 UTF-8 编码选项。

经过一番挖掘,我发现缓存的数据类型数组用零填充,因此在读取该字符串的 unicode 时,它​​会转换为以下内容,我认为它在字符串中为空:

\u0000\u0000\u0000\u0000\u0000\u0000\u000e\u0000\u0000\u000020180901034956%\u0000\u0000\u0000\u0005\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0014\u0000\u0000\ u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0005\u0003\u0000\u0001\u0000~...

应用的一个快速“解决方案”是仅从 typedarray 中删除零或从字符串中删除 null,而不知道它可能如何影响原始数据,从而导致以下结果:

�20180901034956%����������~��var

以及各自的unicode版本

\u000e20180901034956%\u0005\u0001\u0014\u0002\u0001\u0002\u0005 \u0003\u0001~�\u0013var

在线搜索其中一些字符显示其中一些是控制字符,现在我完全不知道为什么会发生这种情况 - 除了这是缓存的数据 - 以及如何正确解码它。

我已经尝试向 Firefox 的频道寻求帮助,但似乎连续 3 天后没有人回答,所以我在这里发布了这个问题。

我怎样才能以正确的方式解码缓存数据,还有谁能解释它为什么会这样显示?所有其他未缓存的数据都被正确解码。

编辑:经过更多挖掘后,我确认数据是从 Firefox 缓存文件中读取的数据。我能够找到正确的文件,其中包含以下信息示例(在记事本中打开):

20180901034956% ~ÿ var

“var”之后的文本遵循每个字符的相同格式,后跟一个“空格”,如果那甚至是一个空格。所以确认这是从缓存文件传递的数据,那么我怎样才能正确解码呢?我认为删除空格不是一个合适的解决方案,因为它还可以删除作为原始数据信息一部分的空格。

EDIT2:数据假设如下所示:

变量

后面什么都没有,每个字符之间也没有空格。

标签: decodefirefox-addon-webextensionstyped-arrayschrome-webrequest

解决方案


看起来这确实是一个 Firefox 错误,而我已经使用的解决方法是我们自己“修复”这个问题的唯一方法,直到 Firefox 决定自行纠正问题。

忘记添加错误报告的链接:https ://bugzilla.mozilla.org/show_bug.cgi?id=1530408#c6


推荐阅读