Когда возвращать 200 или 416 в запросе с заголовком Range HTTP? - PullRequest
0 голосов
/ 29 октября 2018

Учитывая, что сервер поддерживает запросы диапазона и что он ДОЛЖЕН ответить кодом состояния 206 Partial Content, если HTTP-запрос содержит хотя бы один выполнимый диапазон в заголовке Range, отправленном клиентом, я читаю RFC 7233, и я У меня возникли некоторые трудности с пониманием того, когда сервер должен возвращать ответ 416 Range Not Satisfiable или 200 OK на запрос с заголовком Range.

Например, RFC сообщает (https://httpwg.org/specs/rfc7233.html#header.range):

Сервер происхождения ДОЛЖЕН игнорировать поле заголовка Range, которое содержит дальность единица не понимает. Прокси МОЖЕТ отбросить заголовок Range поле, содержащее единицу измерения, которую он не понимает.

Что означает ignore здесь? Означает ли это, что сервер ДОЛЖЕН возвращать 416 или просто игнорировать заголовок Range и возвращать все представление клиенту с кодом состояния 200?

Чтение далее (https://httpwg.org/specs/rfc7233.html#status.416), спецификация гласит:

Примечание. Поскольку серверы могут игнорировать Range, многие реализации просто ответит всем выбранным представлением в 200 (ОК) ответ.

Насколько я понимаю, когда сервер игнорирует заголовок Range, он может безопасно вернуть код состояния 200 со всем представлением, поэтому ответом на мой вопрос выше будет код состояния 200?

Затем, прочитав следующий абзац:

Код состояния 416 (Диапазон не удовлетворен) указывает, что ни один из диапазоны в поле заголовка Range запроса (раздел 3.1) перекрывают текущий экстент выбранного ресурса или тот набор диапазонов Запрошенный был отклонен из-за недопустимых диапазонов или чрезмерного запрос малых или перекрывающихся диапазонов.

Я бы сказал, что 416 более подходит, когда все диапазоны синтаксически действительны, но не могут быть удовлетворены по какой-либо причине (например, все first-byte-pos меньше, чем соответствующий last-byte-pos, но все больше или равны текущая длина представления).

То есть я бы возвратил код состояния 416 только тогда, когда в заголовке Range запроса нет допустимых диапазонов, и я бы возвратил код состояния 200, когда:

  • Как минимум один синтаксически неверный byte-range-spec или suffix-byte-range-spec;

  • Метод запроса не GET (A server MUST ignore a Range header field received with a request method other than GET, https://httpwg.org/specs/rfc7233.html#header.range);

  • В любом другом случае, когда в спецификации указано ignore the Range header;

Верны ли мои предположения?

Спасибо за внимание.

...