Сводка : Я хотел бы сделать запрос заголовка Range со страниц GitHub.Однако в некоторых браузерах это происходит сбой - возможно, из-за проблем со сжатием Gzip.Он работает в Chrome (v74), но не в FF (v66), Mac OS.
Цель : я хотел бы надежно выполнить этот запрос во всех браузерах, например, путем принудительного ответаtype для кодирования в виде текста при каждом запросе диапазона.
Мне не ясно, продиктовано ли это поведение браузером, сервером или какой-либо их комбинацией.Знание происхождения может помочь определить исправление - работа со страницами Github была бы хороша, но не обязательна.
Мне также не ясно, представляет ли это ошибку, и если да, то где.(в браузере, в спецификации и т. д.)
Пример тестового примера : Возможно, из-за кодирования gzip на стороне сервера, пример тестового примера не воспроизводится локально.Вам нужно будет ввести эти команды в консоли JS на https://abought.github.io/weetabix/
для воспроизведения.
fetch('https://abought.github.io/weetabix/example_data/McDonald_s.csv', {headers: {range: 'bytes=1-100'}} ).then(resp => resp.text());
В chrome это выбирает текст ответа.В Firefox он выдает «ошибку декодирования».
Если я опускаю resp.text
, Firefox может выполнить запрос - ошибка декодирования заключается в чтении тела, а не в любом другом коде.Копирование как curl показывает, что FF добавляет флаг --compress
, а Chrome - нет.
Исследования Если диапазон байтов 0-100, запрос работает в FF.Если диапазон составляет 1-100, он терпит неудачу.В этом разделе файла содержатся все символы ASCII.
Если я проверяю заголовки ответа (Array.from(r.headers.entries())
), у FF есть дополнительный «content-encoding: gz flag», который, как мне кажется, вызывает проблему.(например, gzip не имеет смысла без секретных инструкций декодера)
Я пытался добавить 'accept-encoding': 'identity'
к запросу на выборку, но это запрещенный заголовок и изменение его с помощью кода не имеет никакого эффекта.