从通过 webRequest FilterResponseData StreamFilter 传递的 TypedArray 缓存数据解码字符串

Decode String from TypedArray cached data passed via webRequest FilterResponseData StreamFilter

我正在使用 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~�\u0013\u0000\u0000\u0000\u0000\u0000v\u0000a\u0000r

应用的快速 "solution" 只是从 typedarray 中删除零或从字符串中删除空值,而没有意识到它会如何影响原始数据,结果如下:

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

以及各自的unicode版本

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

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

我尝试通过 Firefox 的渠道寻求帮助,但似乎连续 3 天都没有人回答,所以我在这里发布这个问题。

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

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

20180901034956% ~ÿ v a r

"v a r" 之后的文本遵循相同的格式,即每个字符后跟一个 "space",即使是 space。所以确认这是从缓存文件传递的数据,那么我怎样才能正确解码呢?我认为删除 spaces 不是一个合适的解决方案,因为它也可以删除作为原始数据信息一部分的 spaces。

EDIT2:数据应该是这样的:

var

后面没有任何内容,每个字符之间也没有 spaces。

看起来这确实是一个 Firefox 错误,在 Firefox 决定自行解决问题之前,我已经使用的解决方法是 "fix" 自己解决这个问题的唯一方法。

忘记将 link 添加到错误报告中:https://bugzilla.mozilla.org/show_bug.cgi?id=1530408#c6

看来这个错误将在 Firefox 76 中得到修复。