HTTP: Как мне реагировать на "Range: bytes=", когда Range не поддерживается?
Каков правильный ответ на запрос GET с полем заголовка Range: bytes=278528-
если Range
не поддерживается?
Читая определения заголовков HTTP ( http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html), я думаю, что я должен по крайней мере установить: Accept-Ranges: none
, но в нем четко говорится, что
Клиенты МОГУТ генерировать запросы диапазона байтов, не получив этот заголовок для задействованного ресурса.
Итак, если клиент запрашивает диапазон, я должен:
- Ответить с целым файлом из байта 0?
- Ответить с какой-то ошибкой статуса? (400/406/416/501) см.: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
4 ответа
Вы можете игнорировать это, как сказано в спецификации. Точнее:
- Если вы поддерживаете его, вы возвращаете код состояния 206 Partial Content и включаете соответствующие заголовки, такие как Content-Range.
- Если вы не поддерживаете его, вы возвращаете 200 OK, как обычно.
Я не проверял это, но спецификация кажется довольно ясной. Я видел эту работу - использование wget или curl для возобновления прерванной загрузки будет правильно перезапущено с самого начала, если сервер не поддерживает заголовок Range.
RFC2616 раздел 14.35.2 говорит:
Сервер МОЖЕТ игнорировать заголовок Range.
Возможность проверить заголовок http и, если есть строка диапазона, проанализировать ее, проанализировать диапазоны, вычислить пропустить и занять позиции, открыть поток файлов по URL, затем попытаться пропустить и взять байты 'take ', настроить ответ на него отправь ответ и наконец закрой поток. не забудьте ответить заголовком диапазона
не игнорируйте диапазон, никогда, когда вы работаете на больших потоках.
если вы используете nanohttp, я могу помочь вам с примером
Игнорирование запросов диапазона может привести к воспроизведению контента (который огромен) на сервисе трансляции или другого нестабильного или неприемлемого. Я знаю, что http не подходит протоколу для передачи видео, но попробуйте отправить видео в эфир с сервера, не принимая диапазоны.... Airplay использует запросы диапазонов...