Возможны ли поддерживающие соединения HTTP без заголовков длины содержимого?

Я понимаю, что в HTTP 1.0 содержимое ответа завершается закрытием соединения.

В HTTP 1.1 были введены keep-alive соединения, позволяющие выполнять несколько запросов и ответы в одном TCP-соединении.

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

Тестируя, я обнаружил, что это работает, когда я устанавливаю заголовок content-length в ответ. Зная длину содержимого, клиент знает, когда содержимое полностью получено, и может проанализировать следующий ответ.

Мой вопрос:

Можно ли отправлять несколько ответов в постоянном соединении без установки заголовка длины содержимого?

Если да, то как?

Для пояснения: я думаю о сценариях, в которых длина ответа неизвестна при запуске его отправки клиенту, и я хотел бы знать, является ли закрытие соединения единственным способом реализовать это.


person Lukas Boersma    schedule 13.03.2018    source источник


Ответы (1)


Заголовок Transfer-Encoding — это то, что я искал.

Установив для параметра transfer-encoding значение chunked, можно опустить заголовок Content-Length.

При кодировании поблочной передачи сообщение может быть отправлено несколькими порциями, длина которых известна. Чтобы завершить сообщение, отправляется кусок с нулевой длиной.

Это позволяет иметь постоянное соединение и по-прежнему отправлять сообщения, длина которых неизвестна при начале их отправки.

person Lukas Boersma    schedule 13.03.2018