Tomcat Gzip пока несущевой проблемой
-
25-09-2019 - |
Вопрос
Я проверяю некоторые проблемы с одним из моих услуг по источникам данных. Как говорится в заголовках отклика HTTP, он работает на Apache-Coyote / 1.1. Сервер дает ответы с кодировкой Transferning: Colaled, здесь пример ответа:
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
И проблема заключается в том, когда я запрашиваю сервер, чтобы отправить запрос Gziped, он часто отправляет не полный ответ. Я получаю ответ, увидим, что последний кусок получил, но затем после безгласимости я вижу, что ответ является частичным. Я никогда не видел такого поведения с gzip выключил в заголовки запроса.
Итак, мой вопрос: это общая проблема Tomcat? Может быть, один из него мода, который делает сжатие? Или, может быть, это, может быть, какой-то проблема прокси? Я не могу рассказать о версиях Tomcat или какой GZIP мод они используют, но не стесняйтесь спрашивать, попробую спросить моего поставщика услуг.
Спасибо.
Решение
Поскольку длина содержания ответа GZaked непредсказуема, и потенциально дорого и медленно сжимается на память сначала с компрессорами, затем рассчитать длину, а затем поток затемненного отклика от памяти, средний веб-сервер отправит их в куски Transfer-Encoding:
chunked
без а. Content-Length
заголовок
Поскольку это доморощенный клиент HTTP, звучит так, как будто он правильно обрабатывает сложные запросы. Вы должны определить Transfer-Encoding
заголовок ответа и если это равна chunked
, Тогда вы должны разбирать его как сложный поток.
Вы можете узнать у вышеупомянутых ссылок HTTP-спецификации и от Википедия Как разбирать повторный поток. Каждый чан состоит из заголовка, обозначающего длину кусочки в шестнадцатеричном, затем CRLF, затем фактический контент куска, затем CRLF. Это повторяется до куска с заголовком, обозначающим длину кусочки 0
. Отказ Вам нужно сгладить куски отдельно, а затем склеить их вместе.
Чтобы сохранить всю утомительную кодирующую работу (вероятно, также для остатка вашего доморощенного HTTP-клиента), я настоятельно рекомендую взглянуть на Apache httpComponents клиент.