Zatrzymywanie transferu PHP cURL po prefiksie ciała
Zachowaj ograniczony prefiks w callbacku zapisu i rozpoznawaj tylko ten błąd zapisu, który ten callback wywołuje celowo.
Callback zapisu cURL może zachować ograniczony prefiks ciała i zatrzymać transfer, gdy tylko ten limit zostanie osiągnięty. Użyj własnej flagi, aby odróżnić to celowe zatrzymanie od innego błędu zapisu.
Dla nowego uchwytu, którego docelowy URL jest już skonfigurowany:
$limit = 32768;
$prefix = '';
$limitReached = false;
curl_setopt_array($ch, [
CURLOPT_PROXY => 'socks5h://proxy.example.net:1080',
CURLOPT_HEADER => false,
CURLOPT_WRITEFUNCTION => function ($handle, $chunk)
use (&$prefix, &$limitReached, $limit) {
$remaining = $limit - strlen($prefix);
$prefix .= substr($chunk, 0, $remaining);
if (strlen($prefix) >= $limit) {
$limitReached = true;
return 0;
}
return strlen($chunk);
},
]);
$result = curl_exec($ch);
$error = curl_errno($ch);
$expectedStop = $limitReached && $error === CURLE_WRITE_ERROR;
if ($result === false && !$expectedStop) {
throw new RuntimeException(curl_error($ch), $error);
}
Schemat socks5h w URL-u proxy prosi proxy o rozwiązanie nazwy docelowego hosta. Do dozwolonego testu publicznego celu na pokazanym nowym uchwycie może posłużyć wpis bez konta z listy proxy SOCKS5. Weryfikacja certyfikatu TLS zachowuje normalne ustawienia.
Zwrócenie zera dla niepustego fragmentu informuje libcurl, że callback nie przyjął dostarczonych danych. Transfer zostaje przerwany z CURLE_WRITE_ERROR. Tutaj za oczekiwane uznaje się wyłącznie połączenie tego błędu i flagi limitReached callbacku.
Odpowiedź krótsza niż limit kończy się normalnie. Na limicie lub powyżej prefix przechowuje najwyżej 32 KiB, nawet jeśli ostatni callback otrzyma większy fragment. Rozmiary fragmentów się różnią; żądany rozmiar bufora nie gwarantuje wywołań o stałej długości.
Ogranicza to zachowane ciało, a nie każdy bajt już zbuforowany lub przesłany na połączeniu. Prefiks może zakończyć się w środku znaku wielobajtowego, wartości JSON lub elementu HTML, więc nie zakładaj, że jest to kompletny dokument możliwy do przeanalizowania.