Hlavičky PHP cURL přes proxy: CONNECT versus odpovědi cíle
Udržujte oddělené hlavičky CONNECT, autentizace, přesměrování a konečné odpovědi, když přenos PHP cURL používá proxy.
Sbírejte řádky hlaviček odděleně od těla odpovědi. Přenos přes proxy může doručit hlavičky CONNECT, autentizace, přesměrování a odpovědi cíle v jedné operaci:
$headerLines = [];
curl_setopt($handle, CURLOPT_HEADERFUNCTION,
function ($handle, $line) use (&$headerLines) {
$headerLines[] = $line;
return strlen($line);
}
);
Toto zpětné volání zachovává surovou posloupnost řádků a vrací počet přijatých bajtů. Dostává kompletní řádky; zatím je však neseskupuje do odpovědí ani nevybírá hlavičky konečného webu.
Vykládejte posloupnost jako bloky
Řádek stavu HTTP začíná blok odpovědi a prázdný řádek ukončuje jeho hlavičky. Zachovejte tyto hranice, než vyberete konečnou odpověď cíle. Mezilehlé pokusy o autentizaci a přesměrování mohou každý přidat bloky.
Trailery mohou později dorazit přes zpětné volání. Udržujte dost stavu parseru, abyste je odlišili od počátečních hlaviček, místo abyste každé pozdější pole připojovali k první odpovědi.
Zachovejte nebo potlačte důkaz tunelu
Čtěte CURLINFO_HTTP_CONNECTCODE samostatně pro stav CONNECT tunelu HTTPS. Přijatý tunel neprokazuje úspěšnou odpověď webu.
Pokud sběrač hlavičky CONNECT nepotřebuje, CURLOPT_SUPPRESS_CONNECT_HEADERS řídí jejich doručení do nakonfigurovaného výstupu hlaviček a cest zpětných volání. Ověřte podporu v propojených libcurl a sestavení PHP. Potlačení zjednodušuje sběr, ale odstraňuje důkaz tunelu na úrovni hlaviček, který může pomoci diagnostice.
Neobnovujte tělo pomocí pevného offsetu ani hledáním HTML značky. Velikosti hlaviček se liší, mezilehlé odpovědi se liší a tělo může být binární nebo prázdné. Staré hlášení chyby specifické pro verzi neopravňuje odhadovaný offset.
Udržujte zpracování těla oddělené a při selhání sběru nebo analýzy si ponechte chybu přenosu spolu s pozorovanými fázemi odpovědi. To rozliší přerušené zpětné volání, poškozená data aplikace a odmítnutou výměnu přes proxy.