Callback за запис на cURL може да запази ограничен префикс от тялото и да спре трансфера, щом този лимит бъде достигнат. Използвайте собствен флаг, за да различите това умишлено спиране от друга грешка при запис.

За нов 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. Тук за очаквана се приема само комбинацията от тази грешка и флага limitReached на callback-а.

Отговор, по-къс от лимита, завършва нормално. При или над лимита prefix пази най-много 32 KiB, дори последният callback да получи по-голяма част. Размерите на частите варират; поисканият размер на буфера не обещава извиквания с фиксирана дължина.

Това ограничава запазеното тяло, а не всеки байт, вече буфериран или прехвърлен по връзката. Префиксът може да завърши в средата на многобайтов символ, JSON стойност или HTML елемент, затова не приемайте, че е пълен документ, който може да се анализира.

Подобни статии