Content-Range работает в Safari, но не в Chrome
Я передаю аудиофайлы с сервера Node.js Express с помощью Content-Range
заголовки плюс нет заголовков кэширования. Это работает нормально в последнем Safari, но не в Chrome.
Хотя при потоковой передаче полного аудиофайла с HTTP 200
мои заголовки были
{ 'Content-Length': 4724126,
'Content-Type': 'audio/mpeg',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'POST, GET, OPTIONS',
'Access-Control-Allow-Headers': 'POST, GET, OPTIONS',
Expires: 0,
Pragma: 'no-cache',
'Cache-Control': 'no-cache, no-store, must-revalidate' }
и это работает как на Chrome и Safari <audio>
тег.
При потоковой передаче частичного содержимого по HTTP 206 заголовки
{ 'Content-Length': 4724126,
'Content-Type': 'audio/mpeg',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'POST, GET, OPTIONS',
'Access-Control-Allow-Headers': 'POST, GET, OPTIONS',
Expires: 0,
Pragma: 'no-cache',
'Cache-Control': 'no-cache, no-store, must-revalidate',
'Accept-Ranges': 'bytes',
'Content-Range': 'bytes 120515-240260/4724126' }
Это привело к ошибке на странице Chrome, где <audio>
или же <video>
тег был.
Даже встроенный медиа-тег, созданный Chrome при использовании потокового URL прямо в браузере, не работает, и это привело к этому
Аудиофайл подается на чтение локального файла и создание потока чтения файла через Node.js. createReadStream
апи:
var file = fs.createReadStream(path, {start: range[0], end: range[1]});
Я разместил код для сервера здесь.
[ОБНОВИТЬ]
Оказывается, что Chrome не является более строгим Range
а также Content-Range
запросы / ответы. Так что любой Content-Range
ответ должен иметь Range
предыдущий запрос. Типичным случаем является очистка панели игрока ко второму S. API отправит "Range"
на запрос сервер ответит заголовком "Content-Range". В моем случае я отправлял Content-Range
ответ на обычный запрос без "Range"
, Сафари работает, потому что это больше street-html
жалоба, т.е. она не требует строго "Range"
запрос перед "Content-Range"
ответ. Итак, я удалил заголовок "Content-Range" из моего ответа, и он не работает. Конец истории (!).
Чтобы ответить на этот вопрос, я также разместил сообщение на форуме Chromium net-dev в Chrome bad. Заголовок диапазона: Range: bytes=0-