Rfc 2616 http content-length и совместимость с кодировкой передачи

RFC 2616 указывает, что заголовок Content-Length не должен отправляться, если присутствует Transfer-Encoding.

The Content-Length header field MUST NOT be sent if these two lengths are different (i.e., if a Transfer-Encoding header field is present).

Однако, если получены оба заголовка, клиент должен игнорировать Content-Length.

If a message is received with both a Transfer-Encoding header field and a Content-Length header field, the latter MUST be ignored.

Верно ли мое толкование, что клиент должен рассматривать случай, когда оба заголовка присутствуют, как правильный HTTP-ответ? Или это конкретная реализация этого пункта?

Я спрашиваю, потому что стандартный пакет Go net/http возвращает ошибку, когда происходит такой сценарий.

RFC 2616 устарел - проверьте RFC 7230. Не уверен, что это поможет, но может

C.M. 26.10.2018 07:27
1
1
360
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Стандарт на самом деле не определяет, что должно происходить в этом случае, только то, что если сообщение вообще принято, то Content-length следует игнорировать. Цитировать из RFC 7230:

If a message is received with both a Transfer-Encoding and a Content-Length header field, the Transfer-Encoding overrides the Content-Length. Such a message might indicate an attempt to perform request smuggling (Section 9.5) or response splitting (Section 9.4) and ought to be handled as an error.

Обратите внимание на слабый "должен" здесь, который далеко не ДОЛЖЕН. Но, по крайней мере, net/http полностью прав в том, что такой ответ неверен и может обрабатываться как ошибка. Но это не требуется рассматривать как ошибку.

На практике кажется, что все браузеры принимают такой ответ и обычно игнорируют заголовок Content-length. Но я видел также поведение MS Edge в прошлом, когда он правильно обрабатывал тело ответа как фрагментированное, но дополнительно использовал Content-length и игнорировал любые байты из тела ответа, не охваченные Content-length.

Спасибо! Это очень помогает. TIL RFC 7230

ssemilla 26.10.2018 07:44

Другие вопросы по теме