Nagłówki PHP cURL przez proxy: CONNECT a odpowiedzi miejsca docelowego
Trzymaj osobno nagłówki CONNECT, uwierzytelniania, przekierowań i odpowiedzi końcowej, gdy transfer PHP cURL korzysta z proxy.
Zbieraj wiersze nagłówków oddzielnie od treści odpowiedzi. Transfer przez proxy może dostarczyć nagłówki CONNECT, uwierzytelniania, przekierowania i odpowiedzi miejsca docelowego w jednej operacji:
$headerLines = [];
curl_setopt($handle, CURLOPT_HEADERFUNCTION,
function ($handle, $line) use (&$headerLines) {
$headerLines[] = $line;
return strlen($line);
}
);
Ten callback zachowuje surową kolejność wierszy i zwraca liczbę przyjętych bajtów. Otrzymuje pełne wiersze; jednak nie grupuje ich jeszcze w odpowiedzi ani nie wybiera nagłówków końcowej witryny.
Interpretuj sekwencję jako bloki
Wiersz statusu HTTP rozpoczyna blok odpowiedzi, a pusty wiersz kończy jego nagłówki. Zachowaj te granice, zanim wybierzesz końcową odpowiedź miejsca docelowego. Pośrednie próby uwierzytelniania i przekierowania mogą każde dodać bloki.
Trailery mogą pojawić się później przez callback. Zachowaj wystarczający stan parsera, aby odróżnić je od początkowych nagłówków, zamiast przypinać każde późniejsze pole do pierwszej odpowiedzi.
Zachowaj lub wycisz dowód tunelu
Odczytaj CURLINFO_HTTP_CONNECTCODE osobno dla statusu CONNECT tunelu HTTPS. Zaakceptowany tunel nie dowodzi udanej odpowiedzi witryny.
Jeśli nagłówki CONNECT nie są potrzebne kolektorowi, CURLOPT_SUPPRESS_CONNECT_HEADERS kontroluje ich dostarczanie do skonfigurowanego wyjścia nagłówków i ścieżek callbacku. Sprawdź wsparcie w połączonym libcurl i kompilacji PHP. Wyciszenie upraszcza zbieranie, ale usuwa dowód tunelu na poziomie nagłówków, który może pomóc w diagnostyce.
Nie odzyskuj treści za pomocą stałego przesunięcia ani szukając znacznika HTML. Rozmiary nagłówków się różnią, odpowiedzi pośrednie są różne, a treść może być binarna lub pusta. Stary raport błędu dotyczący konkretnego wydania nie uzasadnia zgadywanego przesunięcia.
Trzymaj obsługę treści osobno i zachowaj błąd transferu wraz z zaobserwowanymi etapami odpowiedzi, jeśli zbieranie lub analiza się nie powiedzie. To odróżnia przerwany callback, uszkodzone dane aplikacji i odrzuconą wymianę przez proxy.