私は nodeJS Proxy を開発していますが、Google Chrome の奇妙な動作に遭遇しました。これはFiddlerでも再現できます。
gzip 圧縮されたコンテンツをブラウザーに送信すると、異なる圧縮済み/解凍済みのコンテンツ サイズが認識されません。しかし、コンテンツはまだ正しく表示されています。
問題を再現するための小さなコードを次に示します。
var http = require('http'),
zlib = require('zlib'),
fs = require('fs');
var Proxy = http.createServer(function(request, response) {
var raw = fs.createReadStream('test');
response.writeHead(200, {
'content-encoding': 'gzip',
});
raw.pipe(zlib.createGzip()).pipe(response);
});
Proxy.listen(8000);
ファイル「test」にはダミーの HTML が含まれており、ファイルサイズは約 90KB です。次のようにコードをテストします。
$ curl localhost:8000 | gunzip
これは正しく機能するので、nodeJS コードは正しいと思います。
問題
これは、gzip された応答のスクリーンショットです。サイズとコンテンツの値はほぼ同じです。しかし、受信した gzip されたコンテンツ ( Size ) は、解凍されたコンテンツ ( Content ) よりもはるかに小さいと予想されます。
また、期待される「Content-Encoding: gzip」ヘッダーが表示されません。また、「Content-Length」ヘッダーは、圧縮されていないファイルの長さを示しています。Fiddlerを介して HTTP トラフィックをパイプすると、同じ結果が得られます
この URL は、予期される動作を生成します。
http://www.heise.de/js/jquery/jquery-1.7.1.min.js
それで、私は何を間違っていますか?
Chrome で間違ったサイズが表示されるのはなぜですか? または、nodeJS コードは応答として何か間違ったものを送信しますか?