Сохраняйте двоичные ответы изображений в прокси Node.js
Передавайте двоичные тела через прямой прокси Node и оставляйте декодирование текста только для намеренных текстовых преобразований.
const { pipeline } = require('node:stream');
pipeline(upstreamResponse, clientResponse, (error) => {
if (error) console.error('Proxy response failed:', error);
});
Используйте этот путь тела после выбора цели, запроса к источнику и подготовки статуса и заголовков для клиента. Потоки Node обычно выдают Buffer; не собирайте их в строку для изображений или другого неизменного двоичного содержимого.
pipeline координирует противодавление и распространяет ошибки. При ошибке он может уничтожить приёмник, поэтому не предполагайте, что после этого можно отправить ещё один ответ с ошибкой HTTP. Этот фрагмент не является полноценным прокси-сервером.
Для проходящих байтов сохраняйте соответствующие метаданные представления, такие как тип медиа и кодировка содержимого, а поля, специфичные для перехода, обрабатывайте правилами пересылки. Сравнение байтов gzip и соответствующих заголовков ответа показывает выбор между кодированным и декодированным представлением.
Намеренная перезапись HTML требует другого пути: распознать тип медиа, обработать сжатие и кодировку символов, преобразовать текст и сгенерировать метаданные для новых байтов. Старый Content-Length не может описать изменённое тело.
Buffer.concat может сохранить двоичное содержимое, когда требуется полная буферизация, но хранит всё тело в памяти. Проходящий поток изображения не нуждается в этих затратах.