Подтвердить что ты не робот

Gzip компрессию отклика на кодирование?

Я пытаюсь заставить свой веб-сервер правильно gzip HTTP-ответ, который является кодировкой chunk.

мое понимание ответа не-gzip заключается в том, что оно выглядит так:

<the response headers>

а затем для каждого фрагмента

<chunk length in hex>\r\n<chunk>\r\n

и, наконец, фрагмент нулевой длины:

0\r\n\r\n

Я пытался заставить сжатие gzip работать, и я мог бы использовать некоторую помощь, чтобы выяснить, что должно быть действительно возвращено. Эта документация подразумевает, что весь ответ должен быть gzipped, в отличие от gzipping каждого фрагмента:

HTTP servers sometimes use compression (gzip) or deflate methods to optimize transmission.
Chunked transfer encoding can be used to delimit parts of the compressed object.
In this case the chunks are not individually compressed. Instead, the complete payload 
is compressed and the output of the compression process is chunk encoded.

Я попробовал gzip всю вещь и вернуть ответ даже без chunked, и это не сработало. Я попытался настроить заголовок Content-Encoding на "gzip". Может кто-нибудь объяснить, какие изменения должны быть внесены в вышеуказанную схему для поддержки gzipping кусков? Спасибо.

4b9b3361

Ответ 1

Вы загружаете содержимое и только затем применяете закодированную кодировку:

"Так как" chunked "- это единственное кодирование передачи, которое требуется понимать получателям HTTP/1.1, оно играет решающую роль в разграничении сообщений в постоянном соединении. Всякий раз, когда кодирование передачи применяется к теле полезной нагрузки в запрос, последнее примененное кодирование передачи ДОЛЖНО быть" разделено ". Если в тело полезной нагрузки ответа используется передающее кодирование, то либо применяемое окончательное кодирование передачи ДОЛЖНО быть" разделено ", либо сообщение ДОЛЖНО быть завершено закрытием соединения Когда" кодированное "передаточное кодирование используется, оно ДОЛЖНО быть последним кодированием передачи, применяемым для формирования тела сообщения." Чанкуемое "кодирование передачи НЕ ДОЛЖНО применяться более одного раза в теле сообщения."

(HTTPbis Part1, раздел 6.2.1)

Ответ 2

Если другие ответы недостаточно ясны:

Сначала вы gzip тело с zlib (это можно сделать в потоке, так что вам не нужно все сразу в памяти, что является целым звеном)

Затем вы отправляете это сжатое тело в куски (предположительно те, которые предоставлены потоком gzip, с заголовком блока, чтобы объявить, как долго это происходит), с кодировкой Content-Encoding: gzip и Transfer-Encoding: chunked headers (и no Заголовок Content-Length).

Если вы используете gzip или zcat или какую-то такую ​​утилиту для сжатия, это, вероятно, не сработает. Нужно быть zlib. Если вы создаете куски, а затем сжимаете их, это определенно не сработает. Если вы считаете, что делаете это правильно, и он не работает, вы можете попробовать взять трассировку пакетов и задать вопросы на основе этого и любых сообщений об ошибках, которые вы получаете.

Ответ 3

Вероятно, вы действительно не отправляете надлежащий gzip-ответ.

Попробуйте установить window bits в 31 в zlib. И используйте deflateInit2().