Transfer-Encoding: chunkedのメモ

ふとchunkedの挙動が気になったので調べたメモ。nodeのhttpはデフォルトでTransfer-Encoding: chunkedになってる。

require('http').createServer(function(req, res) {
  res.writeHead(200, {'content-type': 'text/html' });
  res.write('<style>body{background:red}</style>\n');
  res.write('<body>\n');
  setTimeout(function() {
    res.write('foo\n');
    setTimeout(function() {
      res.end('bar\n');
    }, 1000);
  }, 1000);
}).listen(8000);

これで最初背景赤くなって一秒後foo、二秒後barってでるかなーと思ったけど2秒後に一気に出力されて全然chunkedじゃなかった(Chrome13, Firefox6)。curlではちゃんと順番に表示されるのを確認した。

調べたらIE以外は1024byte受信後(か全データ受信後)じゃないとレンダリングを開始しないということがわかったので

res.write(new Array(1024).join(' '));

というのをstyleの前に追加したら期待する挙動になった。