HTTP - 如何发送多个预缓存的 gzipped 块?

Ter*_*ska 5 gzip google-chrome http zlib node.js

假设我在内存中有 2 个单独的 gzip html 块。我可以将 chunk1+chunk2 发送到 HTTP 客户端吗?有没有浏览器支持这个?或者没有办法做到这一点,我必须gzip整个流而不是单个块?

我想为客户端提供服务,例如 chunk1+chunk2 和 chunk2+chunk1 等(不同的顺序),但我不想每次都压缩整个页面,也不想缓存整个页面。我想使用预压缩缓存块并发送它们。

nodejs 代码(节点 v0.10.7):

// creating pre cached data buffers
var zlib = require('zlib');
var chunk1, chunk2;
zlib.gzip(new Buffer('test1'), function(err, data){
  chunk1 = data;
});
zlib.gzip(new Buffer('test2'), function(err, data){
  chunk2 = data;
});


var http = require('http');
http.createServer(function (req, res) {
      res.writeHead(200, {'Content-Type': 'text/plain', 'Content-Encoding': 'gzip'});
      // writing two pre gziped buffers
      res.write(chunk1); // if I send only this one everything is OK
      res.write(chunk2); // if I send two chunks Chrome trying to download file
      res.end();
}).listen(8080);
Run Code Online (Sandbox Code Playgroud)

当我的示例服务器返回这种响应时,Chrome 浏览器显示下载窗口(它不理解:/

Mar*_*ler 5

我还没有尝试过,但是如果 http 客户端符合RFC 1952,那么它们应该接受连接的 gzip 流,并以相同的结果解压它们,就好像数据都被压缩到一个流中一样。RFC 2616中的 HTTP 1.1 标准实际上参考了 RFC 1952。

如果“块”指的是分块传输编码,那么这与压缩无关。如果客户端确实接受连接流,那么分块传输编码边界就没有理由必须与其中的 gzip 流对齐。

至于如何做到这一点,只需gzip您的作品并直接连接它们。不需要其他格式化或准备。

  • 对于任何好奇的人来说,浏览器似乎不支持连接的 gzip 流。我在 Firefox 中尝试没有成功,这个 Chrome 错误表明不支持 Chrome:http://code.google.com/p/chromium/issues/detail?id=20884 (3认同)