Как отключить Transfer-Encoding в Tomcat 6
У меня есть веб-приложение, работающее на сервере Tomcat 6.0.29 и JDK 1.6.
Когда я отправляю ответ клиенту, Tomcat отправляет
Transfer-Encoding: chunked
в заголовках, когда размер ответа составляет > 8 КБ. Для ответов < 8 КБ, он отправляет
Content-Length :
Я понимаю, что Chunked encoding является предпочтительным способом обработки массовых ответов, однако наши клиенты не хотят менять свой код (поскольку он распространяется по всем серверам).
Как отключить кодировку Chunked в Tomcat?
Я могу отключить HTTP/1.1 в Tomcat и включить HTTP/1.0 (не знаю, как это сделать)
Я пробовал следующее без успеха:
-
В теге Connector в server.xml
я установил bufferSize =" 65536"
Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
bufferSize="65536" socketBuffer="65536"
redirectPort="8443" />
-
Использование NIOConnector в server.xml со следующей конфигурацией:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
socket.directBuffer="false"
socket.rxBufSize="25188"
socket.txBufSize="43800"
socket.appReadBufSize="32768"
socket.appWriteBufSize="32768"
socket.bufferPool="500"
socket.bufferPoolSize="100000000"
socket.processorCache="500"
socket.keyCache="500"
socket.eventCache="500"
socket.tcpNoDelay="false"
socket.soKeepAlive="true"
socket.soTimeout="5000"
redirectPort="8443" />
Ответы
Ответ 1
Единственный способ заставить его работать - установить BufferSize в ответ.
response.setBufferSize()
устанавливает заголовок Content-Length
размера ответа. Как только размер ответа выходит за пределы bufferSize, он будет возвращаться к Transfer-Encoding: Chunked
.
Размер буфера должен быть установлен в соответствующее значение. Установка его на более высокое значение будет буферизовать весь ответ в памяти перед его промывкой. Поэтому значение должно быть настроено на оптимистический размер.
Немногие из моих клиентов зависят от заголовка ответа Content-Length
. Я должен установить это для обратной совместимости. По умолчанию размер буфера Tomcat установлен в 8K (я думаю, что для Weblogic/Websphere это 32K байт).
Ответ 2
Насколько я знаю, чтобы отключить выделение в Tomcat, вы должны указать заголовок длины контента в своем сервлете.
Ответ 3
Добавление заголовка [Connection: close] в ответ запрещает Tomcat добавлять заголовок [Transfer-Encoding: chunked].