我们如何区分deflate stream和deflateRaw stream?

时间:2016-05-30 07:22:06

标签: node.js http zlib

某些HTTP服务器发送deflate raw body(没有zlib头)而不是实际的deflate body。请参阅讨论:Why do real-world servers prefer gzip over deflate encoding?

是否有可能在Node.js中检测到它们并正确处理膨胀?我的意思是除了尝试createInflate他们并发现错误,然后再次尝试createInflateRaw

1 个答案:

答案 0 :(得分:6)

如果十六进制中的第一个字节具有8的低nybble,则它是一个zlib流。否则它是原始的放气流。 (假设您事先知道唯一可能的选择是有效的zlib流或有效的deflate流。)原始deflate流在低第一个nybble中永远不会有8,但zlib流总是会。

背景:

zlib头格式将压缩方法放在第一个字节的低nybble中。对于deflate,压缩方法总是8

原始deflate流中的位序列从字节的最低有效位开始。如果前三位是000(与8一样),则表示存储(未压缩的块),并且它不是最后一个块。存储块将输入的字节放在字节边界上。因此,在写入000位之后压缩器完成的下一步工作是用零位填充字节的其余部分以到达下一个字节边界。因此,下一位永远不会是1,因此有效的deflate流不可能使前四位为1000,或者第一个nybble为8。 (注意,这些位是从下往上读的。)

有效的deflate流的第一个(即低)nybble只能是0 .. 5a .. d。如果您看到6 .. 9ef,那么它就不是有效的deflate流。