PHP cURL のプロキシ経由ヘッダー: CONNECT と宛先応答の違い
PHP cURL の転送がプロキシを使うとき、CONNECT、認証、リダイレクト、最終応答の各ヘッダーを区別して保持します。
ヘッダー行は応答本文とは分けて収集します。プロキシ経由の転送では、CONNECT、認証、リダイレクト、宛先応答のヘッダーが 1 回の操作で届くことがあります。
$headerLines = [];
curl_setopt($handle, CURLOPT_HEADERFUNCTION,
function ($handle, $line) use (&$headerLines) {
$headerLines[] = $line;
return strlen($line);
}
);
このコールバックは生の行順を保持し、受け入れたバイト数を返します。完全な行を受け取りますが、まだ応答ごとにまとめたり、最終的なウェブサイトのヘッダーを選んだりはしません。
並びをブロックとして解釈する
HTTP ステータス行が応答ブロックを開始し、空行がそのヘッダーを終了します。最終的な宛先応答を選ぶ前に、この境界を保ちます。途中の認証試行やリダイレクトも、それぞれブロックを追加することがあります。
トレーラーは後からコールバック経由で届くことがあります。後続の各フィールドを最初の応答に結び付けるのではなく、初期ヘッダーと区別できるだけのパーサー状態を保ちます。
トンネルの証拠を残すか抑止する
HTTPS トンネルの CONNECT ステータスは CURLINFO_HTTP_CONNECTCODE を別途読み取ります。受け入れられたトンネルは、ウェブサイトの応答が成功したことを証明しません。
収集側が CONNECT ヘッダーを必要としない場合、CURLOPT_SUPPRESS_CONNECT_HEADERS が設定されたヘッダー出力とコールバック経路への配信を制御します。リンクされた libcurl と PHP ビルドでのサポートを確認してください。抑止すると収集は簡単になりますが、診断に役立つヘッダーレベルのトンネル証拠が失われます。
固定オフセットや HTML タグの検索で本文を取り出さないでください。ヘッダーのサイズは変わり、途中の応答も異なり、本文はバイナリや空の場合もあります。古いリリース固有のバグ報告は、推測したオフセットの根拠になりません。
本文の扱いは分離し、収集や解析が失敗した場合は転送エラーを観測した応答段階とともに保持します。これにより、中断されたコールバック、不正なアプリケーションデータ、拒否されたプロキシ交換を区別できます。