Получить необработанную веб-страницу с кодировкой gzip в Uint8Array

Я использую fetch для получения URL-адреса. Это в коде, который действует как прокси, и если он получает ответ с кодировкой содержимого: gzip, я хочу получить необработанные данные, чтобы я мог отправить их обратно потребителю без декодирования.

Но я не вижу способа сделать это. Response.blob, Response.arrayBuffer, Response.body.getReader(), .... все они, кажется, декодируют содержимое.

Так, например, в моем тестовом случае я получаю массив байтов размером 15 КБ вместо фактического тела ответа, которое было всего 4 КБ.

Есть ли способ получить необработанное содержимое ответа без его декодирования?

1 ответ

Браузер автоматически декодирует сжатые ответы HTTP, закодированные с помощью gzip, на своем низкоуровневом сетевом уровне перед тем, как передать данные ответа программному уровню Javascript. Учитывая, что сжатые байты уже переданы по сети и доступны в браузерах пользователей, эти данные уже «отправлены заказчику».

API Compression Streams может эффективно создавать файлы в формате Gzip,ArrayBuffer,Blob, и т. д:

      const [ab, abGzip] = await Promise.all((await fetch(url)).body.tee().map(
  (stream, i) => new Response(i === 0
    ? stream
    : stream.pipeThrough(new CompressionStream('gzip'))
  ).arrayBuffer()
))

Полный пример

https://batman.dev/static/74634392/

Изображение SVG, закодированное с помощью gzip, предоставляется пользователям в виде ссылки на загружаемый файл. Исходное изображение SVG извлекается с помощьюfetch()из ответа, закодированного gzip.

Другие вопросы по тегам