Заголовки PHP cURL через проксі: CONNECT і відповіді цільового сайту
Тримайте окремо заголовки CONNECT, автентифікації, перенаправлень і фінальної відповіді, коли передача PHP cURL використовує проксі.
Збирайте рядки заголовків окремо від тіла відповіді. Передача через проксі може доставити заголовки CONNECT, автентифікації, перенаправлення та відповіді цільового сайту за одну операцію:
$headerLines = [];
curl_setopt($handle, CURLOPT_HEADERFUNCTION,
function ($handle, $line) use (&$headerLines) {
$headerLines[] = $line;
return strlen($line);
}
);
Цей зворотний виклик зберігає сиру послідовність рядків і повертає кількість прийнятих байтів. Він отримує повні рядки; однак поки не групує їх у відповіді й не вибирає заголовки підсумкового сайту.
Тлумачте послідовність як блоки
Рядок стану HTTP починає блок відповіді, а порожній рядок завершує його заголовки. Зберігайте ці межі до вибору фінальної відповіді цілі. Проміжні спроби автентифікації та перенаправлення можуть додавати блоки.
Трейлери можуть надійти пізніше через зворотний виклик. Тримайте достатньо стану парсера, щоб відрізняти їх від початкових заголовків, замість того щоб прикріплювати кожне наступне поле до першої відповіді.
Зберігайте або придушуйте свідчення тунелю
Читайте CURLINFO_HTTP_CONNECTCODE окремо для статусу CONNECT тунелю HTTPS. Прийнятий тунель не доводить успішну відповідь сайту.
Якщо заголовки CONNECT збирачеві не потрібні, CURLOPT_SUPPRESS_CONNECT_HEADERS керує їх доставкою до налаштованого виводу заголовків і шляхів зворотного виклику. Перевірте підтримку в пов'язаних libcurl і збірці PHP. Придушення спрощує збір, але видаляє свідчення тунелю на рівні заголовків, яке може допомогти діагностиці.
Не відновлюйте тіло фіксованим зсувом або пошуком HTML-тегу. Розміри заголовків різняться, проміжні відповіді відрізняються, а тіло може бути двійковим або порожнім. Старий звіт про помилку, специфічний для версії, не виправдовує вгаданий зсув.
Тримайте обробку тіла окремо й зберігайте помилку передачі разом із спостереженими етапами відповіді, якщо збір або розбір не вдався. Це розрізняє перерваний зворотний виклик, пошкоджені дані застосунку та відхилений обмін через проксі.