Получить необработанную веб-страницу с кодировкой 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.