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 елемента, па немојте претпостављати да је то потпуни документ који се може парсирати.

Повезани чланци