Подтвердить что ты не робот

Как можно игнорировать кодирование контента

У меня есть устройство, с которого мне нужно загрузить файл. В некоторых случаях файл может иметь неправильный content-encoding. В частности, он может иметь кодировку содержимого "gzip", если он не скремблирован или сжат каким-либо образом.

Итак, когда файл gzipped, просто получить контент с помощью базового ajax GET:

$.ajax({
    url: 'http://' + IP + '/test.txt',
    type: 'GET'
})
.done(function(data) {
    alert(data);
});

Но это не так, как вы могли ожидать, когда неправильное кодирование содержимого.

Чтобы быть ясным, я не ищу решение обходить ERR_CONTENT_DECODING_FAILED, просто перейдя к данному URL-адресу в браузере. Я хочу иметь возможность загружать, например, csv, в строку в javascript для дальнейшего разбора.

Могу ли я получить файл и заставить его пропустить попытку декодирования или переопределить кодировку содержимого ответа или некоторые такие?

4b9b3361

Ответ 1

Это просто невозможно сделать с помощью клиентского JavaScript в соответствии с WHATWG спецификацией XHR, которая использует операцию выборки из WHATWG Fetch Standard.

Клиентские скрипты могут читать только объект ответа, предоставленный средой браузера. Стандарт Fetch определяет, как среда браузера должна построить атрибут body объекта ответа на шаге 2 операции выборки (обратите внимание, особенно, на подстановки с 2 по 4):

  1. Всякий раз, когда передается один или несколько байтов, пусть байты являются переданными байтами и запускают следующие подпункты:

    • Увеличить тело ответа, переданное с длиной байтов.

    • Пусть кодировки являются результатом разбора Content-Encoding в списке заголовков ответов.

    • Установите байты в результат обработки кодировок контента с учетом кодировок и байтов.

    • Нажмите байты в тело ответа.

В тех случаях, когда кодирование содержимого обработки действия:

Чтобы обрабатывать кодировки содержимого с учетом кодировок и байтов, выполните следующие подшаги:

  • Если кодировки не поддерживаются, верните байты.

  • Возвращает результат декодирования байтов с данными кодировками, как описано в HTTP.

Из этого определения видно, что объект ответа никогда не предоставляет закодированные байты в свойстве тела. Прежде чем байты могут быть добавлены в тело, они должны быть сначала декодированы. Клиент script никогда не имеет доступа к тому, что спецификация вызывает "переданные байты" (то есть фактические закодированные байты, отправленные по проводу).

Декодирование определяется исключительно заголовком Content-Encoding. Механизм, с помощью которого клиентский JavaScript не может манипулировать заголовками ответов объекта ответа, отсутствует, поэтому Content-Encoding должен быть независимо от того, что первоначально отправил сервер.

То, что делает ваш сервер, неверно. Возможны следующие варианты:

  • Исправить поведение сервера.

  • Запустите HTTP-ответ через прокси-сервер, который исправляет заголовок ответа Content-Encoding, прежде чем он достигнет вашего клиента.

Ответ 2

В современной среде, основанной на браузере, вы не можете изменить Accept-Encoding, благодаря политике Same-Origin для HttpRequest:

Ссылка на объяснение Google

Для вашего мозгового устройства лучшим решением является прокси-сервер на стороне сервера, который извлекает содержимое и игнорирует неправильную кодировку, а затем возвращает результаты с помощью разумного набора заголовков.