chunkedの制御

Tomcat6ではレスポンスとして「Transfer-Encoding: chunked」なレスポンスを返すことができるが、この制御がどう行なわれているか分かっていなかったので調べてみた。

具体的にはTomcat6の今日の時点でのtrunkのHttp11Processorクラスの実装を見てみた。

http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11Processor.java?view=markup

抜粋:

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になるっぽい。