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 は全体をバッファリングする必要がある場合にバイナリ内容を保持できますが、本文全体をメモリに置きます。通過する画像ストリームにはそのコストは不要です。