Заустављање PHP cURL преноса после префикса тела
Задржите ограничен префикс у write callback-у и препознајте само грешку писања коју тај callback намерно изазива.
cURL write callback може да задржи ограничен префикс тела и заустави пренос када се та граница достигне. Користите сопствену заставицу да разликујете то намерно заустављање од друге грешке писања.
За нови handle чији је циљни URL већ конфигурисан:
$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);
}
socks5h шема у URL-у проксија тражи од проксија да разреши циљно име хоста. За дозвољени тест јавне мете на приказаном новом handle-у, унос без налога са листе SOCKS5 проксија може да обезбеди тај endpoint. Провера TLS сертификата задржава уобичајена подешавања.
Враћање нуле за непразан комад говори libcurl-у да callback није прихватио достављене податке. Пренос се прекида са CURLE_WRITE_ERROR. Овде се очекиваним сматра само спој те грешке и callback-ове заставице limitReached.
Одговор краћи од границе завршава се нормално. На граници или изнад ње prefix држи највише 32 KiB, чак и ако последњи callback прими већи комад. Величине комада варирају; тражена величина бафера није обећање позива фиксне дужине.
Ово ограничава задржано тело, а не сваки бајт који је већ у баферу или пренет на вези. Префикс може да се заврши унутар вишебајтног знака, JSON вредности или HTML елемента, па немојте претпостављати да је то потпуни документ који се може парсирати.