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

Как HTTP-клиент должен правильно анализировать * chunked * тело ответа HTTP?

Когда используется кодирование передачи по частям HTTP, зачем серверу записывать размер куска в байтах, а последующие данные куска заканчиваются CRLF?

Разве это не делает отправку двоичных данных "CRLF-unclean" и метод немного избыточным?

Что если в данных есть 0x0A, а затем где-то 0x0D (то есть они фактически являются частью данных)? Ожидается ли, что клиент будет придерживаться размера чанка, явно предоставленного в начале чанка, или дросселя на первом CRLF, с которым он сталкивается в данных?

Насколько я понимаю, ожидаемое поведение клиента состоит в том, чтобы просто взять размер порции, предоставленный сервером, перейти к следующей строке, а затем прочитать именно это количество байтов из следующих данных (CRLF или нет CRLF в них), а затем пропустить CRLF следуя данным и повторяйте процедуру до тех пор, пока не останется кусков. Это совместимое поведение? Если да, то в чем смысл CRLF после каждого блока данных? Читаемость?

Я провел поиск в Интернете по этому вопросу, а также ознакомился со спецификацией HTTP 1.1, но однозначный ответ, похоже, ускользает от меня.

4b9b3361

Ответ 1

Chunked consumer не сканирует тело сообщения для пары CRLF. Сначала он считывает указанное количество байтов, а затем считывает еще два байта, чтобы подтвердить, что они CR и LF. Если это не так, тело сообщения плохо сформировано, и либо размер был указан неверно, либо данные были повреждены.

Заключительный CRLF представляет собой гарантию на пояс и подвески (за RFC 2616, раздел 3.6.1, кодирование с чередованием), но это также служит для поддержания согласованного правила, что поля начинаются в начале строки.

Ответ 2

CRLF после каждого фрагмента, вероятно, просто для лучшей читаемости, поскольку он не нужен из-за размера куска в начале каждого фрагмента. Но CRLF после "заголовка блока" необходим, так как после размера фрагмента может появиться дополнительная информация (см. Chunk Transfer Encoding):

      chunk          = chunk-size [ chunk-extension ] CRLF
                       chunk-data CRLF