Ошибка при создании запросов диапазона в некоторых браузерах - PullRequest
1 голос
/ 30 апреля 2019

Сводка : Я хотел бы сделать запрос заголовка 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' к запросу на выборку, но это запрещенный заголовок и изменение его с помощью кода не имеет никакого эффекта.

1 Ответ

3 голосов
/ 30 апреля 2019

Спецификации здесь изменились совсем недавно. Вот ссылка на PR .

TLDR; Теперь они просят UA добавить заголовок Acccept-Encoding/Identity ко всем Range-запросам.

[§5.15]

Если список заголовков httpRequest содержит Range, добавьте Accept-Encoding / identity в список заголовков httpRequest.

Firefox здесь еще не отслеживался, но отчет об ошибке заполнен .

В настоящее время запросы Range в Firefox действительно выполняются с данными Gzipped, и, таким образом, вы не должны нарушать целостность байтов (например, диапазон 0-100 декодируется в Firefox).

...