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彻底改革的一部分。