Tomcat gzip, в то время как разделенная на блоки проблема

Я испытываю некоторую проблему с одним из моих сервисов источника данных. Как это говорит в заголовках ответа HTTP, это работает Apache-Coyote/1.1. Сервер дает ответы с Кодированием Передачи: разделенный на блоки, здесь демонстрационный ответ:

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

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

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

Спасибо.

6
задан Charles Merriam 1 July 2010 в 06:19
поделиться

1 ответ

Так как длина содержимого gzip-ответа непредсказуема и потенциально дорого и медленно сначала сжимать его полностью в памяти, затем вычислять длину, а затем передавать gzip-ответ из памяти в потоковом режиме, средний веб-сервер будет отправлять их кусками, используя Кодирование передачи: фрагментировано без заголовка Content-Length .

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

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

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

2
ответ дан 17 December 2019 в 20:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: