【问题标题】:gzip without server support?gzip 没有服务器支持?
【发布时间】:2011-01-19 11:39:52
【问题描述】:

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

我想从这个服务器压缩我的响应。正如 IRC 中所说,node.js 目前没有 gzip 库,所以我尝试从命令行手动执行(因为我只在不在缓存中时进行 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 是正确的

【问题讨论】:

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


    【解决方案1】:

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

    Node's string encodings 是 ascii、二进制和 utf8。 [...]“二进制”仅查看 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,未来还是有一些希望的。

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

    【讨论】:

    • 我的问题实际上是内容长度问题,但被另一个狡猾的问题阻止了。不管你是对的,V8 需要快速实现这些东西! :) 感谢您的回复。
    • 节点合并了 net2 分支。您可以在 buffer.js 中将二进制数据与 Buffer 一起使用。
    • @spot 原来的问题还有效吗?
    • @ordnungswidrig 不完全是。现在有其他问题。 :P
    【解决方案2】:

    您是否更新了 Content-Length 以匹配压缩后的大小?看起来这可能会破坏解码。

    【讨论】:

    • 内容被压缩之前它被发送到浏览器。浏览器如何没有正确的长度?但是,我会尝试的。我很绝望。 :)
    • 他的观点是,如果您的服务器将预压缩长度指示为标头,那么您将获得非法的 HTTP 响应。您可以使用 Fiddler 或类似工具轻松检查标题。
    • 好吧,不幸的是没有解决它。
    • 这是另一个阻止结果的错误,但这确实最终成为问题。长话短说,我不会让你厌烦,但感谢你的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 2017-10-11
    相关资源
    最近更新 更多