5

メモリ内に 2 つの個別に gzip された html チャンクがあるとします。チャンク 1 とチャンク 2 を HTTP クライアントに送信できますか? これをサポートしているブラウザはありますか?または、これを行う方法がなく、個々のチャンクではなくストリーム全体を gzip する必要がありますか?

たとえば、チャンク 1 + チャンク 2 やチャンク 2 + チャンク 1 など (異なる順序) のクライアントにサービスを提供したいのですが、毎回ページ全体を圧縮したくなく、ページ全体をキャッシュしたくありません。圧縮済みのキャッシュ済みチャンクを使用して送信したい。

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);

サンプル サーバーがこの種の応答を返すと、Chrome ブラウザーにダウンロード ウィンドウが表示されます (理解できません:/

4

1 に答える 1

5

試したことはありませんが、http クライアントがRFC 1952に準拠している場合、連結された gzip ストリームを受け入れ、データがすべて 1 つのストリームに圧縮されている場合と同じ結果で解凍する必要があります。RFC 2616の HTTP 1.1 標準は、実際には RFC 1952 を参照しています。

「チャンク」によってチャンク転送エンコーディングを参照している場合、それは圧縮とは無関係です。クライアントが連結されたストリームを受け入れる場合、チャンク化された転送エンコードされた境界が内部の gzip ストリームと一致しなければならない理由はありません。

それを行う方法については、ピースをgzipして直接連結するだけです。他のフォーマットや準備は必要ありません。

于 2013-05-24T17:26:16.327 に答える