chunkedの制御
Tomcat6ではレスポンスとして「Transfer-Encoding: chunked」なレスポンスを返すことができるが、この制御がどう行なわれているか分かっていなかったので調べてみた。
具体的にはTomcat6の今日の時点でのtrunkのHttp11Processorクラスの実装を見てみた。
抜粋:
long contentLength = response.getContentLengthLong(); if (contentLength != -1) { headers.setValue("Content-Length").setLong(contentLength); outputBuffer.addActiveFilter (outputFilters[Constants.IDENTITY_FILTER]); contentDelimitation = true; } else { if (entityBody && http11 && keepAlive) { outputBuffer.addActiveFilter (outputFilters[Constants.CHUNKED_FILTER]); contentDelimitation = true; headers.addValue(Constants.TRANSFERENCODING).setString(Constants.CHUNKED); } else { outputBuffer.addActiveFilter (outputFilters[Constants.IDENTITY_FILTER]); } }
どうやら、クライアントからKeep-Aliveが指定されていてかつContent-Lengthが指定されていない場合は自動的にchunkedになるっぽい。