gzip没有服务器支持?

我写了一个最小化和基本parsing/ varreplace的css服务器。 服务器正在使用node.js.

我想从这个服务器gzip我的回应。 正如在IRC中所说的,node.js目前没有gzip库,所以我试图从命令行手动执行(因为我只是在不在caching中时进行gzip压缩)。

我将文件数据推送到临时文件,然后使用exec调用'gzip -c -9 -q ' + tempFile 。 我正确地得到压缩的数据(看来),并发送适当的Content-Encoding标头为'gzip' ,但Chrome报告:

Error 330 (net::ERR_CONTENT_DECODING_FAILED): Unknown error

还有一些独立的gziptesting人员也失败了(不仅仅是Chrome)。

我假设这是简单的,我不知道为浏览器生成gzip块,看到我从来没有尝试过手动。

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

谢谢。

更新我已经validation了我的Content-Length是正确的

你是否更新了Content-Length以匹配gzip的大小? 这似乎可能搞砸了解码。

节点仍然是stream血的边缘,似乎还没有一个良好的处理二进制数据。

节点的string编码是ascii,binary和utf8。 […]“binary”仅在16位JavaScriptstring字符的前8位查找[s]。 问题是根据ECMA的string是16位string。 如果你使用UTF-8(这是默认的),当读入string时会有一些规范化,并且会破坏gzip。 如果你使用ascii,那显然是行不通的。

如果您使用二进制编码读取和写入 ,它将工作。 Javascriptstring字符的高8位不被使用。 如果没有,请尝试直接发送文件到客户端,而不需要任何加载到Javascriptstring,也许借助Node前的代理服务器。

我本人希望Google的V8引擎能够实现一个真正的二进制string数据types,就像这个提议http://groups.google.com/group/nodejs/browse_thread/thread/648a0f5ed2c95211/ef89acfe538931a1?lnk=gst&q=binary+type#ef89acfe538931a1

CommonJS也提出了二进制/ B ,而且由于Node试图遵循CommonJS,未来还有一些希望。

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