Жадный ответ с кодировкой содержимого: gzip возвращается с неправильным заголовком длины содержимого

У меня есть приложение symfony2, в котором я использую http-клиент Guzzle для отправки GET-запроса на сервер для получения содержимого файла json. Ответ Guzzle преобразуется в ответ Symfony2 для браузера.

Ответ Guzzle возвращается со следующими заголовками:

Контент-кодировка: gzip
Длина контента: 2255
Тип контента: приложение / JSON

При выводе данных в пользовательский интерфейс / браузер я замечаю, что они обрезаются из-за неправильной длины содержимого. Размер файла ближе к 4905 байтам, а не 2255. 2255 — это точная длина данных до точки отсечения. Я подозреваю, что 2255 — это размер сжатых данных, и он в какой-то момент распаковывается без обновления длины контента. Теперь я проверил, что я вернул все данные, однако заголовок длины содержимого соблюдается, поэтому данные обрезаются, когда я пересылаю их в браузер. Интересно, что нажатие ссылки на файл json напрямую дает полное содержимое, даже если длина содержимого равна 2255, что означает, что Chrome игнорирует его при обращении к файлу напрямую. То же самое, если я использую клиент POSTman REST, чтобы сделать запрос GET — отображается полное содержимое.

По умолчанию в Guzzle есть опция запроса decode_content = true для обработки ответов. Я установил значение false при отправке запроса, но это, похоже, не решило проблему.

Перед преобразованием ответа Guzzle в ответ Symfony я удалил заголовок длины содержимого, и это, похоже, решило проблему, однако я не уверен, что это лучший подход, поскольку протокол RFC гласит, что заголовок длины содержимого должен присутствовать, если только кодировка передачи заголовок присутствует, но это не так. https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html

Другой альтернативой является то, что, поскольку это потоковый ответ, для получения размера потока и корректировки длины содержимого, однако реализация Guzzle использует для этого strlen (), что оказывает нежелательное влияние на чтение всего потока.

С какими возможными проблемами я могу столкнуться, если я решу опустить заголовок длины содержимого? И как альтернатива, есть ли способ получить ИСТИННУЮ длину содержимого без чтения всего потока и просто обновить заголовок длины содержимого с правильным количеством?

4

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …