Заглавки на 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 таг. Размерите на заглавките варират, междинните отговори се различават, а тялото може да е двоично или празно. Стар доклад за грешка, специфичен за версия, не оправдава предположено отместване.
Дръжте обработката на тялото отделно и запазвайте грешката при трансфера заедно с наблюдаваните етапи на отговора, ако събирането или анализът се провалят. Така се разграничават прекъснато обратно извикване, повредени данни на приложението и отхвърлен обмен през прокси.