没有服务器支持如何使用gzip压缩?

6
我写了一个CSS服务器,可以进行最小化和基本解析/变量替换。该服务器使用node.js。
我想要对来自该服务器的响应进行gzip压缩。根据IRC所说,node.js目前没有gzip库,因此我正在尝试从命令行手动完成(因为只有在不缓存时才进行gzip压缩)。
我将文件数据推送到临时文件中,然后使用exec调用'gzip -c -9 -q '+ tempFile。我正确地收到了压缩数据,并发送了正确的Content-Encoding头作为'gzip',但Chrome报告:
错误330(net :: ERR_CONTENT_DECODING_FAILED):未知错误。
此外,一些独立的在线gzip测试器也失败了(不仅仅是Chrome)。
我认为这可能是我不知道如何为浏览器生成gzip块的简单问题,因为我从未尝试过手动完成它。
任何帮助都将是有益的。该服务器非常快,但我需要对内容进行gzip压缩,以获得最佳的终端用户性能。
谢谢。
更新 我已验证我的Content-Length是正确的。
2个回答

2
Node仍然处于前沿,似乎还没有很好地处理二进制数据的能力。Node的字符串编码是ascii、binary和utf8。[...] "binary"只查看16位JavaScript字符串字符的前8位。问题在于,根据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,因此未来有一些希望。 编辑我刚刚发现了Node的net2分支,其中包含一个二进制缓冲区(请参见src/node_buffer.h)。它似乎是对网络的彻底改版的一部分。

我的问题实际上是一个内容长度问题,但被另一个狡猾的问题所阻塞。但是您是正确的,V8需要快速实现这些东西!:) 感谢您的回复。 - Spot
Node已经合并了net2分支。您可以在buffer.js中使用Buffer处理二进制数据。 - nalply
@spot,原问题仍然有效吗? - ordnungswidrig
@ordnungswidrig 不完全是。现在还有其他问题。 :P - Spot

1
你更新了Content-Length以匹配gzipped大小吗?这似乎会破坏解码。

内容在发送到浏览器之前被压缩。那么浏览器怎么可能没有正确的长度呢?不过,我会尝试一下。我很绝望。 :) - Spot
他的观点是,如果您的服务器将预压缩长度作为标头指示,则会产生非法的HTTP响应。您可以使用Fiddler或类似工具轻松检查标头。 - EricLaw
很遗憾,那并没有解决它。 - Spot
这实际上是另一个导致结果失败的 bug,但最终它确实成为了问题所在。长话短说,我就不再讲述了,感谢您的帮助。 - Spot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接