没有服务器支持的gzip?

时间:2010-02-22 01:59:43

标签: http compression gzip node.js http-compression

我编写了一个CSS服务器,它实现了最小化和基本解析/ var替换。服务器正在使用node.js。

我想从这台服务器gzip我的回复。正如在IRC中所说,node.js当前没有gzip lib,所以我试图从命令行手动执行它(因为我不在缓存中时只是gzip)。

我将文件数据推送到临时文件,然后使用exec调用'gzip -c -9 -q ' + tempFile。我正确地恢复了压缩数据(似乎),并将正确的Content-Encoding标题发送为'gzip',但Chrome会报告:

Error 330 (net::ERR_CONTENT_DECODING_FAILED): Unknown error

此外,一些独立的gzip测试人员也在线失败(不仅仅是Chrome)。

我认为这很简单,我不知道为浏览器生成gzip块,因为我从未尝试过手动操作。

任何帮助都会有所帮助。服务器速度非常快,但我需要对内容进行gzip以获得最终用户的最佳性能。

感谢。

更新 我已验证我的Content-Length是正确的

2 个答案:

答案 0 :(得分:2)

节点仍处于前沿,似乎还没有很好地处理二进制数据。

Node's string encodings是ascii,binary和utf8。 [...]“二进制”仅查看16位JavaScript字符串字符的前8位的[s]。问题是根据ECMA的字符串是16位字符串。如果你使用UTF-8(它是默认值),在读入字符串时会有一些规范化,这会破坏gzip。如果使用ascii,它显然不起作用。

如果您使用二进制编码 读写,它将起作用。刚才没有使用Javascript字符串字符的高8位。如果没有,请尝试将文件直接发送到客户端,而无需加载到Javascript字符串中,可能需要在Node前面的代理服务器的帮助下。

我自己希望Google的V8引擎实现真正的二进制字符串数据类型,类似于此提案http://groups.google.com/group/nodejs/browse_thread/thread/648a0f5ed2c95211/ef89acfe538931a1?lnk=gst&q=binary+type#ef89acfe538931a1

CommonJS也在提议Binary/B,并且由于Node试图遵循CommonJS,因此对未来有一些希望。

编辑我刚刚发现了包含二进制缓冲区的net2 branch节点(请参阅src / node_buffer.h)。它似乎是对网络彻底改革的一部分。

答案 1 :(得分:1)

您是否更新了内容长度以匹配gzip压缩大小?似乎这可能搞砸了解码。