Tomcat GZIP пока чанки выпускать - PullRequest
6 голосов
/ 07 апреля 2010

У меня возникла проблема с одной из моих служб источников данных. Как говорится в заголовках ответа HTTP, он работает на Apache-Coyote / 1.1. Сервер дает ответы с Transfer-Encoding: chunked, здесь пример ответа:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/xml;charset=utf-8
Transfer-Encoding: chunked
Content-Encoding: gzip
Date: Tue, 30 Mar 2010 06:13:52 GMT

И проблема в том, что когда я запрашиваю у сервера отправку gzip-запроса, он часто отправляет не полный ответ. Я получаю ответ, вижу, что последний кусок получен, но затем после распаковки я вижу, что ответ является частичным. Я никогда не видел такого поведения при отключенном gzip в заголовках запросов.

Итак, мой вопрос: это обычная проблема кота? может быть, один из его модов, который делает сжатие? А может это какая-то проблема с прокси? Я не могу рассказать о версиях tomcat или моде gzip, которые они используют, но не стесняйтесь спрашивать, я попробую спросить моего поставщика услуг.

Спасибо.

1 Ответ

2 голосов
/ 08 апреля 2010

Поскольку длина содержимого gzipped-ответа непредсказуема, и это потенциально дорого и медленно сначала сжимать его в памяти, затем вычислять длину и затем передавать gzipped-ответ из памяти, средний веб-сервер отправит их порциями, используя Transfer-Encoding: chunked без a Content-Length заголовка.

Поскольку это доморощенный HTTP-клиент, похоже, что он неправильно обрабатывает фрагментированные запросы. Вы должны определить заголовок ответа Transfer-Encoding, и если он равен chunked, то вы должны проанализировать его как поток с фрагментами.

Вы можете узнать из вышеупомянутых ссылок на спецификации HTTP и из Википедии , как анализировать поток по частям. Каждый чанк состоит из заголовка, обозначающего длину чанка в шестнадцатеричном формате, затем CRLF, затем фактическое содержимое чанка, затем CRLF. Это повторяется до порции с заголовком, обозначающим длину порции 0. Вы должны разархивировать куски отдельно и затем склеить их.

Чтобы сохранить всю утомительную работу по кодированию (вероятно, также и для остатка вашего собственного HTTP-клиента), я настоятельно рекомендую взглянуть на Apache HttpComponents Client .

...