Content-Range работает в Safari, но не в Chrome - PullRequest
0 голосов
/ 12 ноября 2018

Я передаю аудиофайлы с сервера 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 прямо в браузере, не работает, и привел к этому

enter image description here

Аудиофайл подается на чтение локального файла и создание потока чтения файла через Node.js createReadStream api:

var file = fs.createReadStream(path, {start: range[0], end: range[1]});

Я разместил код для сервера здесь .

[UPDATE]

Оказывается, что Chrome более строг в отношении Range и Content-Range запросов / ответов. Таким образом, любой Content-Range ответ должен иметь Range предыдущий запрос. Типичным случаем является очистка панели игрока от второго S. API отправит запрос "Range", сервер ответит заголовком «Content-Range». В моем случае я отправлял Content-Range ответ на обычный запрос без "Range". Safari работает, потому что это более street-html жалоба, т.е. он не требует строго "Range" запроса перед "Content-Range" ответом. Итак, я удалил заголовок «Content-Range» из своего ответа, и он не работает. Конец истории (!).

Чтобы решить эту проблему, я также разместил на форуме Chromium net-dev в Chrome bad Range header: Диапазон: байты = 0-

...