Как отключить кодировку передачи в Tomcat 6

#http-headers #tomcat6 #chunked-encoding

#http-заголовки #tomcat6 #фрагментированное кодирование

Вопрос:

У меня есть веб-приложение, работающее на сервере Tomcat 6.0.29 и JDK 1.6.

Когда я отправляю ответ клиенту, Tomcat отправляет

 Transfer-Encoding: chunked 
  

в заголовках, когда размер ответа > 8 КБ. Для ответов размером менее 8 КБ он отправляет

 Content-Length : 
  

Я понимаю, что фрагментированное кодирование является предпочтительным способом обработки массовых ответов, однако наши клиенты не хотят изменять свой код (поскольку он распределен по всем серверам).

Как я могу отключить фрагментированное кодирование в Tomcat?

Я мог бы отключить HTTP / 1.1 в Tomcat и включить HTTP / 1.0 (не уверен, как я могу это сделать)

Я попробовал следующее, но безуспешно:

  1. В теге Connector в server.xml я устанавливаю bufferSize =" 65536"

     Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           bufferSize="65536" socketBuffer="65536"
           redirectPort="8443" /amp;>
      
  2. Использование 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:

Единственный способ, которым я мог бы заставить это работать, — это установить размер буфера в ответе.

response.setBufferSize() задает Content-Length заголовок размера ответа. Как только размер ответа превысит размер буфера, он вернется к Transfer-Encoding: Chunked . Размер буфера должен быть установлен на соответствующее значение. Установка более высокого значения приведет к буферизации всего ответа в памяти перед его сбросом. Таким образом, значение должно быть установлено в оптимистичный размер.

Немногие из моих клиентов зависят от Content-Length заголовка ответа. Я должен установить это для обратной совместимости. По умолчанию размер буфера Tomcat установлен равным 8 КБ (я думаю, что для Weblogic / Websphere это 32 КБ байт).

Ответ №2:

Насколько я знаю, чтобы отключить фрагментированный вывод в Tomcat, вы должны указать заголовок content length в вашем сервлете.

Комментарии:

1. Я не хочу программно устанавливать заголовок Content-Length. Я ожидал, что либо «bufferSize», либо «socketBuffer» сотворят волшебство. Ни один из них не работает.

2. Я совершенно уверен, что это единственный способ заставить его работать с tomcat.

Ответ №3:

Добавление заголовка [Connection: close] к ответу не позволяет Tomcat добавлять заголовок [Transfer-Encoding: chunked].