最初の URL が HTTPS で、リダイレクト後の URL が HTTP という場合があります。ひとつのエージェントを最初の URL に結び付けるのではなく、リクエストごとの宛先に合わせてエージェントを選びます。

ESM アプリケーションでインポートした node-fetch パッケージには、関数を渡します。

import fetch from 'node-fetch';
import { HttpProxyAgent } from 'http-proxy-agent';
import { HttpsProxyAgent } from 'https-proxy-agent';

const proxyUrl = 'http://proxy.example:8080';
const httpAgent = new HttpProxyAgent(proxyUrl);
const httpsAgent = new HttpsProxyAgent(proxyUrl);

const response = await fetch('https://api.example/', {
  agent: url => url.protocol === 'http:' ? httpAgent : httpsAgent,
});

API の URL とプロキシのエンドポイントを置き換えます。公開の中間プロキシ経由で許可された公開 API では、HTTP プロキシ一覧が proxyUrl の候補を提供します。両方のエージェントは同じ HTTP プロキシリスナーを使えます。名前は宛先へのリクエストを指します。

セレクターに渡される URL選択されるエージェント
https://…httpsAgent
http://…httpAgent

そのためリダイレクトで宛先のプロトコルが変わっても、関数は対応するエージェントを選び続けます。proxyUrl はその判断とは独立に、中間プロキシを表し続けます。

エージェントはワークロードごとに一度だけ作成して再利用します。返されたステータスを処理し、呼び出し側のコードでレスポンスボディを読み取ります。このエージェントインターフェースは node-fetch のもので、Node 組み込みの fetch は別のトランスポートインターフェースを使います。

関連記事